使用AWK合并多无表头制表符文件:追加列并添加指定表头
使用AWK合并多列TSV文件并添加自定义表头
完美解决你的需求!咱们可以用AWK写一个简洁的脚本,既能合并所有文件的第五列,又能自动添加你要的自定义表头——不管是固定3个文件,还是更多文件,都有对应的方案。
方案1:针对固定3个文件的简化版本
如果你的文件数量固定是3个(比如file1.tsv、file2.tsv、file3.tsv),可以用这个直接明了的脚本:
BEGIN { FS = OFS = "\t" # 先输出指定的表头 print "Part", "Start", "End", "Name", "File1", "File2", "File3" } # 处理第一个文件,存储前四列和第五列的映射 NR == FNR { key = $1 FS $2 FS $3 FS $4 data[key][1] = $5 next } # 处理第二个文件 ARGIND == 2 { key = $1 FS $2 FS $3 FS $4 data[key][2] = $5 next } # 处理第三个文件 ARGIND == 3 { key = $1 FS $2 FS $3 FS $4 data[key][3] = $5 } # 最后输出所有合并后的行 END { for (key in data) { print key, data[key][1], data[key][2], data[key][3] } }
运行方式:
awk -f merge_3files.awk file1.tsv file2.tsv file3.tsv > merged_output.tsv
方案2:支持任意数量文件的通用版本
如果以后可能会增加更多文件,这个通用版更省心——它会自动根据输入的文件数量生成表头,无需手动修改脚本:
BEGIN { FS = OFS = "\t" # 构建表头:前四个固定字段 + 对应每个文件的FileN字段 header = "Part\tStart\tEnd\tName" for (i = 1; i < ARGC; i++) { header = header OFS "File" i } print header } # 遍历每个文件,用前四列作为唯一键,存储对应第五列 { key = $1 FS $2 FS $3 FS $4 # ARGIND表示当前正在处理的文件索引(从1开始) data[key][ARGIND] = $5 } # 输出所有合并后的结果 END { for (key in data) { line = key for (i = 1; i < ARGC; i++) { line = line OFS data[key][i] } print line } }
运行方式(支持任意数量的TSV文件):
awk -f merge_general.awk file1.tsv file2.tsv file3.tsv file4.tsv > merged_output.tsv
示例效果
假设你的三个输入文件内容如下:
file1.tsv:
P1 100 200 GenA 5.2 P2 300 400 GenB 3.7file2.tsv:
P1 100 200 GenA 8.9 P2 300 400 GenB 6.1file3.tsv:
P1 100 200 GenA 12.3 P2 300 400 GenB 9.4
运行通用版脚本后,输出的merged_output.tsv内容为:
Part Start End Name File1 File2 File3 P1 100 200 GenA 5.2 8.9 12.3 P2 300 400 GenB 3.7 6.1 9.4
完全符合你要的格式要求!
内容的提问来源于stack exchange,提问作者RonicK
相关产品推荐
相关产品推荐

