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

如何使用awk根据不同的列匹配两个文件?,awk,Awk,我需要根据文件1中的$5和$6以及文件2中的$1和$2为每行匹配两个文件,并在匹配时在文件1中打印文件2中的$3 文件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

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

文件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  

这款awk one liner可以帮助您:

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
    来指示密钥,但在处理文件1时,您应该使用
    $5,$6
    而不是
    $1,$2

  • 如果在文件2中找不到相应的条目,您将在输出中连接一个
    FS
    。我不知道这是否合意

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

{k=…}(k的定义,发生在f1的每一行上)在一个单独的 从$0=。。。(重新定义$0,在其末尾包括 [k]的值(如果存在)部分,即“alwayus true”条件 然后打印新的$0


又输了:)@Inian我刚打开SO主页,看到这个Q…:-)您应该编辑“一行”使
{k=…}
(k的定义,发生在f1的每一行上)与
$0=…
(通过在其末尾包含[k]的值来重新定义
$0
,如果存在)部分分开,这是一个“始终为真”的条件,然后打印新的$0。那样会更清楚一些。但这不是代码高尔夫;)您可能希望通过不太依赖默认设置来增加一些清晰度actions@OlivierDulac关于默认操作。我注意到OP是以这种方式使用的,所以,请遵循。你的评论是有道理的。@Kent:的确如此,但我更喜欢在我的脚本样本中(更^^^^)详细,以防其他阅读答案的人不知道其中的微妙之处。。。