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

如何使用awk根据另一文件的列顺序对目标文件排序?

解决方法

你的原命令存在两个核心问题:一是把f2.txt的内容存在数组a里,f1.txt的内容仅保留每个$1的最后一行到b,最后输出的是f2的内容而非f1的行;二是没有按f2的指定顺序遍历输出。下面提供两种可行的解决方案:

方法一:用Awk分组存储并按指定顺序输出

这种方法直接按f2的顺序批量输出f1中对应分组的所有行:

awk '
NR==FNR { ord[$1] = ++n; next }
{ lines[$1] = lines[$1] $0 "\n" }
END {
    for (i=1; i<=n; i++) {
        for (k in ord) {
            if (ord[k] == i) {
                printf "%s", lines[k]
                break
            }
        }
    }
}
' f2.txt f1.txt

逻辑说明:

  1. 处理f2.txt时,给每个数字分配顺序编号(ord[1]=1、ord[2]=2、ord[3]=3),确保后续按这个顺序输出。
  2. 处理f1.txt时,把同一$1的所有行拼接存入数组lines,保留完整的多行内容。
  3. 最后按顺序编号1到n遍历,找到对应的数字并输出其所有行。

方法二:添加排序键后排序再截断

这种方法通过给f1的行添加f2指定的排序标识,排序后去掉标识得到结果:

awk 'NR==FNR{ord[$1]=++n;next}{print ord[$1], $0}' f2.txt f1.txt | sort -n | cut -d' ' -f2-

逻辑说明:

  1. Awk给f1的每行前面加上f2对应的顺序号(比如1 1变成1 1 1,2 5变成2 2 5)。
  2. sort -n按数字排序,确保行按f2的顺序排列。
  3. cut去掉第一个字段(排序标识),得到最终需要的输出。

内容的提问来源于stack exchange,提问作者Abdel Ra'ouf Badawi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:35:16