我有许多大型 TSV 文件,其中有 6 个未命名列和大约 1000 万行。我需要逐行应用更改并保存为新的 TSV。我正在Linux上工作,可以使用 awk、gawk、grep。理想情况下,代码将在其运算符中引用列号,这样无论行内容如何,它都能正常运行。蒂亚!
唯一需要更改的是第 2 列和第 3 列,但更改取决于第 6 列中的值:
If the value of column 6 is "+", then:
New Column 2: [Column 2 Value]
New Column 3: [Column 2 Value] + 1
If the value of column 6 is "-", then:
New Column 2: [Column 3 Value] - 1
New Column 3: [Column 3 Value]
TSV 数据结构示例(实际数据中不存在 | 存在)
| AI | 828 | 878 | ABC4807:78485:5:79215 | 42 | - |
| AI | 971 | 1021 | ABC248:78485:5:79215:46065 | 42 | + |
| AI | 1104 | 1153 | X7481:78485:5:79215:40174 | 35 | - |
| XVDIII | 56939 | 56988 | 9478:78485:5:79215:30872 | 42 | - |
| XVDIII | 56971 | 57020 | 7841S:78485:5:79215:34301 | 42 | - |
| UTXV | 1043196 | 1043246 | T885189:78485:5:79215:10036 | 42 | + |
| UTXV | 1043198 | 1043248 | C74581:78485:5:79215:10792 | 42 | - |
| UTXV | 1043201 | 1043250 | T75S17:78485:5:79215:30204 | 42 | - |
| UTXV | 1043201 | 1043251 | B784W7:78485:5:79215:42548 | 42 | - |
所需的 TSV 输出
| AI | 877 | 878 | ABC4807:78485:5:79215 | 42 | - |
| AI | 971 | 972 | ABC248:78485:5:79215:46065 | 42 | + |
| AI | 1152 | 1153 | X7481:78485:5:79215:40174 | 35 | - |
| XVDIII | 56987 | 56988 | 9478:78485:5:79215:30872 | 42 | - |
| XVDIII | 57019 | 57020 | 7841S:78485:5:79215:34301 | 42 | - |
| UTXV | 1043196 | 1043197 | T885189:78485:5:79215:10036 | 42 | + |
| UTXV | 1043247 | 1043248 | C74581:78485:5:79215:10792 | 42 | - |
| UTXV | 1043249 | 1043250 | T75S17:78485:5:79215:30204 | 42 | - |
| UTXV | 1043250 | 1043251 | B784W7:78485:5:79215:42548 | 42 | - |
替换值的算法不是问题。有趣的一点是保持固定宽度的列。
文件:
dataconvert.awk
将其标记为可执行
chmod +x dataconvert.awk
文件,您可以直接调用./dataconvert.awk
在此解决方案中,存储列内容的宽度,结果填充少量空格,最后裁剪为存储的长度。
+
如果数据集确实在提供值或第 6 列中没有异常,则可以省略-
第二个子句。if
对于巨大的数据集,这可以节省一些时间。由于数据集以字段分隔符开头,因此第一列始终为空但存在。所以列数必须
+1
以直观的方式来计数。我调整了 dodrg 的响应以适应我的数据结构。我已接受他们的答案,但想将此回复发布给将来可能遇到此问题的任何人。