如何使用awk匹配基于不同列的两个文件?

时间:2016-12-28 16:37:16

标签: awk

我需要根据文件1中的$ 5和$ 6以及文件2的$ 1和$ 2匹配每行的两个文件,并在匹配时在文件1中打印$ 3的file2。

档案1

7   81  1   47  13412   2013-09-27      18:39:34    
7   82  2   10  27723   2010-08-20      18:46:10        
7   83  1   67  27030   2010-05-23      18:51:54        
7   84  2   17  13412   2013-09-28      18:54:19  

文件2

13412   2013-09-27   565  
27723   2010-08-20   582.333  
27030   2010-05-23   514  
13412   2013-09-28   565  
27723   2010-08-21   591.25  
27030   2010-05-24   527  
13412   2013-09-29   561.5  

我尝试过以下代码,但只打印第一个文件而不匹配

awk ‘NR==FNR {a[$1,$2] = $3; next}   $0 = $0 FS a[$1,$2]’ file2 file1  

1 个答案:

答案 0 :(得分:2)

这个awk单行可能会帮助你:

awk 'NR==FNR{a[$1 FS $2]=$3;next}
    {k=$5 FS $6}$0 = $0 ((k in a)? FS a[k]:"")' f2 f1

对于给定的输入,它输出:

7 81 1 47 13412 2013-09-27 18:39:34 565
7 82 2 10 27723 2010-08-20 18:46:10 582.333
7 83 1 67 27030 2010-05-23 18:51:54 514
7 84 2 17 13412 2013-09-28 18:54:19 565

您的问题

  • 您可以使用$x,$y来表示密钥,但在处理file1时,您应该使用$5,$6代替$1,$2

  • 如果在file2中找不到相应的条目,则无论如何都会在输出中连接FS。我不知道是否需要它。

来自@Olivier Dulac的简短解释(下面的评论):

  

{k = ...}(k的定义,在f1的每一行上出现)在一个单独的   来自$ 0 = ...的行(通过在结尾处包括重新定义$ 0)   a [k]的值,如果存在的话)part,那是" alwayus true"条件   然后打印新的$ 0。