AWK技术需求:匹配两文件前三字段并输出指定列内容
没问题,我帮你调整AWK命令来实现匹配前三字段并输出指定内容的需求~
解决方案:基于前三字段匹配两个文件并输出指定列
我们可以利用AWK的数组来存储第二个文件的关键信息,再遍历第一个文件完成匹配。核心思路是:
- 先读取File2,把前三字段的组合作为唯一匹配键,将对应的$6和$7存入数组
- 再读取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
相关产品推荐
相关产品推荐

