如何使用 awk NR==FNR 比较和打印结果

How to compare and print result using awk NR==FNR

我有 2 个文件。 age2.txt & age3.txt
age2.txt

a=30  
b=23  
c=33  
d=43  
e=75  

age3.txt

a=30  
b=26  
c=33  
d=44  
e=75  

我需要一个命令:
比较两个文件的第二列和
打印第一个文件 (age2.txt) 的行,如果找到匹配或
如果不匹配

,则用“failed”打印第一个文件 (age2.txt) 的行

预期输出

a=30 passed  
b=23 failed  
c=33 passed  
d=43 failed  
e=75 passed  

当我用 awk 尝试时,我发现 "failed" 行在两种情况下都重复(注意 b=23 和 d=43,它会重复..)

awk -F= 'NR==FNR{a[NR]=;next}a[FNR]!= {print $line " Failed" ;} a[FNR]= {print $line " Passed" ;}' age2.txt age3.txt  
a=30 Passed  
b=26 Failed  
b=26 Passed  
c=33 Passed  
d=44 Failed  
d=44 Passed  
e=75 Passed  

有人可以帮助避免重复 "failed" 行吗?
提前谢谢你:)

你只需要在 Failed 中添加一个 next:

awk -F= 'NR==FNR{a[NR]=;next}a[FNR]!= {print $line " Failed" ;next} a[FNR]= {print $line " Passed" ;}' age2.txt age3.txt 

结果:

a=30 Passed
b=26 Failed
c=33 Passed
d=44 Failed
e=75 Passed

如果你想让输出反映第一个文件而不是第二个文件的值,那么翻转输入文件的位置:

age3.txt age2.txt

结果:

a=30 Passed
b=23 Failed
c=33 Passed
d=43 Failed
e=75 Passed

你的 awk 可以简化为:

awk 'FNR==NR{a[]; next} {print , ( in a) ? "passed":"failed"}' age3.txt age2.txt
a=30 passed
b=23 failed
c=33 passed
d=43 failed
e=75 passed

要仅比较第二列,请使用:

awk -F= 'FNR==NR{a[]; next} {print [=11=], ( in a) ? "passed":"failed"}' age3.txt age2.txt

一个可能更简单的解决方案是将两个文件合并 paste:

paste age2.txt age3.txt | awk -F'\t' '{print , ==?"passed":"failed"}'