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

AWK技术需求:匹配两文件前三字段并输出指定列内容

没问题,我帮你调整AWK命令来实现匹配前三字段并输出指定内容的需求~

解决方案:基于前三字段匹配两个文件并输出指定列

我们可以利用AWK的数组来存储第二个文件的关键信息,再遍历第一个文件完成匹配。核心思路是:

  1. 先读取File2,把前三字段的组合作为唯一匹配键,将对应的$6和$7存入数组
  2. 再读取File1,用同样的前三字段组合作为键,检查是否存在于数组中,存在则输出你需要的字段组合

常规分行输入版本(推荐)

如果你的文件是每行一条记录(我把你的单行输入拆成了更规范的分行格式),用这个命令最简洁:

awk 'NR==FNR {key=$1 FS $2 FS $3; val[key]=$6 FS $7; next} {key=$1 FS $2 FS $3; if (key in val) print $1, $6, $7, val[key]}' File2 File1

命令解释:

  • NR==FNR:这个条件仅在处理第一个输入文件(File2)时生效
    • key=$1 FS $2 FS $3:用默认空格分隔符拼接前三字段,生成唯一匹配键
    • val[key]=$6 FS $7:把File2的第6、7字段存到以key为下标的数组里
    • next:跳过后续代码,直接处理下一行
  • 处理File1时,同样生成前三字段的key,若key在数组中存在,就输出$1 + File1的$6、$7 + File2的$6、$7

单行输入适配版本

如果你的输入文件确实是所有记录挤在同一行,用这个命令可以按每7个字段为一组来处理:

awk 'BEGIN{RS=""; FS=" "} {for(i=1; i<=NF; i+=7) {key=$(i) FS $(i+1) FS $(i+2); if (NR==1) val[key]=$(i+5) FS $(i+6); else {if (key in val) printf "%s %s %s %s ", $(i), $(i+5), $(i+6), val[key]}} END{print ""}' File2 File1

测试验证

输入文件内容

File1:

BSTN-SANJ BSTN SANJ 0 0 50 105910
MRFD-SANJ MRFD SANJ 0 0 40 69105
NYRK-SANJ NYRK SANJ 0 0 30 905010
SANJ-HMRD SANJ HMRD 0 0 25 69010
SANJ-NRFK SANJ NRFK 0 0 38 61506

File2:

BSTN-SANJ BSTN SANJ 0 0 45 601251
MRFD-SANJ MRFD SANJ 0 0 39 919591
NYRK-SANJ NYRK SANJ 0 0 25 690155

执行命令后的输出:

BSTN-SANJ 50 105910 45 601251
MRFD-SANJ 40 69105 39 919591
NYRK-SANJ 30 905010 25 690155

完全符合你期望的输出内容~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:05