我需要根据文件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
答案 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。