Shell脚本:两未排序文件按指定键关联并提取指定列
解决方案
你的问题出在两个地方:一是用了-a 2参数(会保留文件2中无匹配的记录),二是join命令要求输入文件必须按关联键排序,而你的文件是未排序的,导致匹配逻辑失效。
正确步骤
要实现仅输出匹配记录,同时指定输出列,需要先对两个文件按关联键排序,再用join处理,还要单独处理表头避免排序混乱:
生成输出表头
提取文件1的完整表头和文件2的第6列表头,合并后写入结果文件:paste -d'|' <(head -n1 file1) <(head -n1 file2 | awk -F'|' '{print $6}') > out_file处理数据行并关联
分别对两个文件的数据行(跳过表头)按关联键排序,再用join匹配,指定输出文件1所有列+文件2第6列,追加到结果文件:join -t'|' -1 1 -2 3 -o 1.1,1.2,1.3,2.6 \ <(tail -n+2 file1 | sort -t'|' -k1,1) \ <(tail -n+2 file2 | sort -t'|' -k3,3) >> out_file
命令参数说明
-t'|':指定字段分隔符为|-1 1:指定文件1的关联键是第1列-2 3:指定文件2的关联键是第3列-o 1.1,1.2,1.3,2.6:指定输出列:文件1的第1、2、3列,加上文件2的第6列- 用
<(...)实现排序后的数据流直接作为join的输入,无需生成临时文件
执行结果
运行后out_file内容和你的期望输出一致:
Username| Status| Managername| Access 4115 | Open | X |Never
内容的提问来源于stack exchange,提问作者Poojaa
相关产品推荐
相关产品推荐

