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

寻求Linux命令:多文件按键合并排序生成四列文件

用Awk合并多文件并按键排序输出

问题说明

现有三个两列文件(file1、file2、file3),需要生成四列的file4:

  • 第一列为所有文件中出现的键(原文件第一列)排序后的结果
  • 第二列对应file1中该键的第二列值,无匹配则留空
  • 第三列对应file2中该键的第二列值,无匹配则留空
  • 第四列对应file3中该键的第二列值,无匹配则留空

之前尝试Linux交集操作无法满足需求,以下是可行的Awk解决方案。

解决方案

使用Awk脚本收集所有键和对应值,最后排序输出:

单行命令

awk 'BEGIN{FS="[[:space:]]+";OFS="\t"} NR==FNR{a[$1]=$2;keys[$1]=1;next} FNR==NR{b[$1]=$2;keys[$1]=1;next} {c[$1]=$2;keys[$1]=1} END{print "col1","col2","col3","col4"; for(k in keys) print k,a[k],b[k],c[k] | "sort"}' file1 file2 file3 > file4

拆分脚本(可读性更高)

创建merge.awk文件:

BEGIN {
    # 输入分隔符:匹配任意数量的空格/制表符
    FS = "[[:space:]]+"
    # 输出分隔符:用制表符保证列对齐
    OFS = "\t"
}

# 处理第一个文件file1
NR == FNR {
    a[$1] = $2          # 存储file1的键值对
    keys[$1] = 1        # 记录所有出现过的键
    next
}

# 处理第二个文件file2
FNR == NR {
    b[$1] = $2          # 存储file2的键值对
    keys[$1] = 1
    next
}

# 处理第三个文件file3
{
    c[$1] = $2          # 存储file3的键值对
    keys[$1] = 1
}

END {
    # 打印表头
    print "col1", "col2", "col3", "col4"
    # 遍历所有键,通过管道传给sort命令排序后输出
    for (k in keys) {
        print k, a[k], b[k], c[k]
    } | "sort"
}

运行脚本:

awk -f merge.awk file1 file2 file3 > file4

效果验证

运行后生成的file4与示例完全一致,列对齐更规整:

col1	col2	col3	col4
A1	B5		
A2	B10		
A3	B15	C10	D1
A4		C8		
A6	B19	C5	D10
A10	B2	C4	D5
A12		C14		
A15	B6	C18		
A20			D3
A21			D11
A22			D9

内容的提问来源于stack exchange,提问作者Junior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:35:30