Linux下对大型TSV文件进行条件编辑的技术实现需求
处理大型TSV文件的列批量修改方案
需求说明
拥有多个包含6个无命名列、约1000万行的大型TSV文件,需在Linux环境下逐行修改后保存为新TSV文件,要求仅通过列号引用进行修改,不依赖行内容。修改规则如下:
- 若第6列值为
+:新第2列保持原第2列值,新第3列为原第2列值+1 - 若第6列值为
-:新第2列为原第3列值-1,新第3列保持原第3列值
解决方案(awk命令)
使用awk工具实现高效流式处理,无需加载整个文件到内存,适配大文件场景:
# 处理单个文件 awk -F'\t' '{ if ($6 == "+") { $2 = $2; $3 = $2 + 1 } else if ($6 == "-") { $2 = $3 - 1; $3 = $3 } # 确保输出为标准TSV格式 OFS="\t"; print $0 }' input.tsv > output.tsv # 批量处理多个TSV文件(处理后文件名为原文件名加_modified后缀) for file in *.tsv; do awk -F'\t' '{ if ($6 == "+") { $2 = $2; $3 = $2 + 1 } else if ($6 == "-") { $2 = $3 - 1; $3 = $3 } OFS="\t"; print $0 }' "$file" > "${file%.tsv}_modified.tsv" done
命令说明
-F'\t':指定输入分隔符为制表符(TSV的标准分隔符)$n:通过列号直接引用对应列,完全满足「不依赖行内容」的要求OFS="\t":设置输出分隔符为制表符,保证输出仍是标准TSV格式- 流式处理:awk逐行读取、处理、输出,内存占用极低,适合1000万行级别的大文件
示例验证
输入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 -
性能优化提示
- 若文件体量极大,可使用
gawk(GNU awk)替代系统默认awk,其处理大文件的性能表现更优 - 批量处理时可结合
parallel工具并行处理多个文件,进一步提升效率(需提前安装parallel)
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

