按指定列匹配两个文件并输出全部列的实现方案咨询
问题说明
你需要按文件1的第1列与文件2的第2列做等值关联,匹配成功后输出两个文件的所有列,你尝试的两个命令都存在问题:
- 你写的awk命令仅将文件1的第2列存入数组,丢失了文件1第3~5列的内容,因此输出结果缺少字段
- 你用的join命令默认按两个文件的第1列做关联匹配,和你的需求不符;就算你已经提前对两个文件做了排序,不指定关联字段也无法得到正确结果
正确实现方案
方案1:awk实现(无需提前排序,适配任意顺序的输入文件)
直接执行以下命令即可得到预期结果:
awk 'FNR==NR{arr[$1]=$0;next} ($2 in arr){print $1,arr[$2]}' file1 file2 > file3
命令逻辑说明:
- 先遍历第一个输入文件file1,以file1第1列作为数组键,file1整行内容作为数组值存入数组
arr - 再遍历第二个输入文件file2,判断file2的第2列是否存在于数组键中
- 匹配成功时按顺序输出file2的第1列、匹配到的file1整行内容,刚好和你预期的输出顺序一致
方案2:join实现(需先按关联字段对两个文件排序)
join命令要求两个输入文件都必须按关联字段升序排序,且需要显式指定关联列,执行步骤如下:
- 对file1按关联字段(第1列)排序:
sort -k1,1 file1 > file1_sorted - 对file2按关联字段(第2列)排序:
sort -k2,2 file2 > file2_sorted - 执行join关联并指定输出顺序:
join -1 1 -2 2 file1_sorted file2_sorted -o "2.1 2.2 1.2 1.3 1.4 1.5" > file3
参数说明:
-1 1:指定第一个输入文件(file1_sorted)用第1列作为关联键-2 2:指定第二个输入文件(file2_sorted)用第2列作为关联键-o:自定义输出字段顺序,按需求先输出file2的第1、2列,再输出file1的第2~5列
内容的提问来源于stack exchange,提问作者kllrdr
相关产品推荐
相关产品推荐

