基于第一列ID匹配合并多份Tab分隔文件的AWK实现问题
多Tab分隔文件按ID匹配合并解决方案
核心需求
以FILE_1的第一列ID为基准,合并另外10份Tab分隔文件的对应列:匹配到ID则追加该文件的后续列内容,未匹配到则对应列填充NA。
通用AWK解决方案
以下代码支持任意数量的待合并文件(这里对应10份),自动处理多列情况,无需手动调整列数:
BEGIN { FS = "\t" OFS = "\t" } # 处理除FILE_1外的所有待合并文件 ARGIND > 1 { if (FNR == 1) { # 记录当前文件第一列之后的列数 col_cnt[ARGIND] = NF - 1 next } # 拼接当前ID对应的所有后续列 content = "" for (i=2; i<=NF; i++) { content = content (content ? OFS : "") $i } data[ARGIND][$1] = content next } # 处理基准文件FILE_1 { printf "%s", $0 # 遍历所有待合并文件,追加对应内容或NA for (i=2; i<=ARGC-1; i++) { if ($1 in data[i]) { printf "%s%s", OFS, data[i][$1] } else { # 生成对应列数的NA串 na = "" for (j=1; j<=col_cnt[i]; j++) { na = na (na ? OFS : "") "NA" } printf "%s%s", OFS, na } } print "" }
使用方式
将上述代码保存为merge_ids.awk,然后执行命令:
awk -f merge_ids.awk FILE_1 FILE_2 FILE_3 ... FILE_11
(把FILE_2到FILE_11替换成你的实际文件名)
代码说明
- 文件区分:用
ARGIND变量判断当前处理的文件,ARGIND=1对应基准文件FILE_1,ARGIND>=2对应待合并的其他文件。 - 列数记录:
col_cnt数组存储每个待合并文件第一列之后的列数,保证未匹配时填充正确数量的NA。 - 数据存储:二维数组
data[文件索引][ID]保存每个待合并文件中ID对应的后续列内容。 - 基准文件处理:遍历
FILE_1的每一行,先输出本行内容,再依次追加每个待合并文件的匹配内容或NA串。
示例验证
输入文件
FILE_1:
ID ColA ColB 1 a b 2 c d 3 e f
FILE_2:
ID ColC 1 x 3 y
FILE_3:
ID ColD ColE 2 z w
输出结果
ID ColA ColB ColC ColD ColE 1 a b x NA NA 2 c d NA z w 3 e f y NA NA
内容的提问来源于stack exchange,提问作者Dipali
相关产品推荐
相关产品推荐

