awk比较2个文件,打印匹配和非匹配行;第一个文件的第3列和第二个文件的第2列

时间:2014-01-20 12:07:20

标签: unix awk

在这个例子中,需要比较两个文件f1.txt和f2.txt并获得匹配和不匹配,对于这种情况我希望匹配第二个文件的第二列和第一个文件的第三列。然后首先打印f2.txt的第二个字段,然后打印整行f1.txt。并且在f2.txt上找不到匹配状态" Not Found"然后打印f1.txt整行。

F1.txt

2;3;1;4;5;6;7;8
2;3;1a;4;5;6;7;8
2;3;1b;4;5;6;7;8
2;3;2b;4;5;6;7;8

F2.txt

First;1
Firsta;1a
Firstb;1b

期望的输出:

First;1;2;3;1;4;5;6;7;8
Firsta;1a;2;3;1a;4;5;6;7;8
Firstb;1b;2;3;1b;4;5;6;7;8
Not Found;Not Found;2;3;2b;4;5;6;7;8

1 个答案:

答案 0 :(得分:1)

这可以是一种方式:

awk 'BEGIN{FS=OFS=";"}
     FNR==NR {a[$2]=$0; next}
     { t=($3 in a)?a[$3]:"Not found"OFS"Not found"; print t,$0}' f2 f1

它返回:

$ awk 'BEGIN{FS=OFS=";"}FNR==NR {a[$2]=$0; next} { t=($3 in a)?a[$3]:"Not found"OFS"Not found"; print t,$0}' f2 f1
First;1;2;3;1;4;5;6;7;8
Firsta;1a;2;3;1a;4;5;6;7;8
Firstb;1b;2;3;1b;4;5;6;7;8
Not found;Not found;2;3;2b;4;5;6;7;8

解释

基本上它取自http://backreference.org/2010/02/10/idiomatic-awk/。要解释的唯一方面应该是:

  • t=($3 in a)?a[$3]:"Not found"OFS"Not found"。它是三元运算符var= check_condition ? value_if_true : value_otherwise。所以如果值在第二个文件中,t包含我们需要的行;否则,它包含"未找到"值。