awk比较2个文件,打印匹配和非匹配行

时间:2014-01-20 07:29:48

标签: unix awk

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

F1.txt

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

F2.txt

First;1 
Firsta;1a 
Firstb;1b

期望的输出:

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

尝试但没有工作:

awk -F";" 'NR==FNR{a[$1]=$0;b[$1]=$0;next}{ if (a[$2]=b[$1]) print a[$1],$0;else print "NotAvailable","NotAvailable", $0;}' OFS=";" f2.txt f1.txt

1 个答案:

答案 0 :(得分:0)

你很亲密。这是正确的脚本:

$ awk -F ";" 'NR==FNR{a[$2]=$0;next}{print (a[$1]?a[$1]:"Not Found;Not Found") ";" $0}' F2.txt F1.txt 
First;1;1;2;3;4;5;6;7;8
Firsta;1a;1a;2;3;4;5;6;7;8
Firstb;1b;1b;2;3;4;5;6;7;8
Not Found;Not Found;2b;2;3;4;5;6;7;8

注意从输入文件中删除任何尾随空格。