如何拆分TXT文件逗号分隔字段并生成带首尾内容的多行?
解决多行制表符文件的字段拆分与关联保留问题
这题用awk来处理再合适不过了——tr只能做简单的字符替换,没法关联其他字段,而awk可以精准操控每一个字段,完美实现你要的拆分+保留关联内容的需求。
核心解决方案
直接用下面的awk命令处理你的文本文件(假设文件名为input.txt):
awk 'BEGIN { FS = "\t"; OFS = "\t" } { split($4, arr, ","); for (i in arr) { printf("%s\t%s", $1 FS $2 FS $3, arr[i]); for (j=5; j<=NF; j++) { printf("%s%s", OFS, $j) } print "" } }' input.txt > output.txt
脚本逐行解释
我把脚本拆解开给你讲清楚逻辑,方便你根据自己的需求调整:
BEGIN { FS = "\t"; OFS = "\t" }:在处理任何行之前,先设置输入字段分隔符(FS)和输出字段分隔符(OFS)为制表符,保证输出格式和原文件一致。split($4, arr, ","):把当前行的第四字段按逗号分割,存入数组arr里,每个逗号分隔的条目就是数组的一个元素。- 循环遍历数组
arr:- 先输出原行的前三个字段,接着输出当前拆分出来的条目;
- 再循环输出原行第五个及以后的所有字段(也就是第四字段后面的内容);
- 最后用
print ""换行,完成一行的输出。
示例演示
假设你的输入文件input.txt有以下内容:
X 147010263 rs12345 EXON,NON_SYNONYMOUS_CODING ref=A alt=T 3 41278119 rs67890 INTRON ref=C alt=G 4 114275304 rs09876 UTR5,UTR3 ref=G alt=A qual=99.9
运行命令后,输出文件output.txt的内容会是:
X 147010263 rs12345 EXON ref=A alt=T X 147010263 rs12345 NON_SYNONYMOUS_CODING ref=A alt=T 3 41278119 rs67890 INTRON ref=C alt=G 4 114275304 rs09876 UTR5 ref=G alt=A qual=99.9 4 114275304 rs09876 UTR3 ref=G alt=A qual=99.9
额外说明
- 这个脚本兼容绝大多数
awk版本(包括GNU awk、BSD awk等),不需要额外安装工具; - 如果第四字段的条目里包含空格,脚本依然能正常工作,因为
split只按逗号分割,不会破坏条目内容; - 如果你的文件特别大,
awk的处理效率也很高,比用shell循环逐行处理快得多。
内容的提问来源于stack exchange,提问作者Emil Cioran
相关产品推荐
相关产品推荐

