如何使用awk根据不同的列匹配两个文件?
我需要根据文件1中的$5和$6以及文件2中的$1和$2为每行匹配两个文件,并在匹配时在文件1中打印文件2中的$3 文件1如何使用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
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
你的问题
- 您可以使用
来指示密钥,但在处理文件1时,您应该使用$x,$y
而不是$5,$6
$1,$2
- 如果在文件2中找不到相应的条目,您将在输出中连接一个
。我不知道这是否合意FS
又输了:)@Inian我刚打开SO主页,看到这个Q…:-)您应该编辑“一行”使
{k=…}
(k的定义,发生在f1的每一行上)与$0=…
(通过在其末尾包含[k]的值来重新定义$0
,如果存在)部分分开,这是一个“始终为真”的条件,然后打印新的$0。那样会更清楚一些。但这不是代码高尔夫;)您可能希望通过不太依赖默认设置来增加一些清晰度actions@OlivierDulac关于默认操作。我注意到OP是以这种方式使用的,所以,请遵循。你的评论是有道理的。@Kent:的确如此,但我更喜欢在我的脚本样本中(更^^^^)详细,以防其他阅读答案的人不知道其中的微妙之处。。。