You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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.7

file2.tsv:

P1	100	200	GenA	8.9
P2	300	400	GenB	6.1

file3.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:54