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

时间:2016-02-10 18:32:06

标签: bash shell awk sh

我有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)和“已通过” 如果不匹配,则打印第一个文件行(age2.txt)“失败”

预期输出

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

当我用awk尝试时,我看到对于我而言,“失败”行重复了两种情况(b = 23和d = 43的注意事项,重复...)

awk -F= 'NR==FNR{a[NR]=$2;next}a[FNR]!=$2 {print $line " Failed" ;} a[FNR]=$2 {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  

有人可以帮助避免重复“失败”的线路吗? 提前谢谢你:)

3 个答案:

答案 0 :(得分:0)

您只需要在next中添加Failed

awk -F= 'NR==FNR{a[NR]=$2;next}a[FNR]!=$2 {print $line " Failed" ;next} a[FNR]=$2 {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

答案 1 :(得分:0)

你的awk可以简化为:

awk 'FNR==NR{a[$1]; next} {print $1, ($1 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[$2]; next} {print $0, ($2 in a) ? "passed":"failed"}' age3.txt age2.txt

答案 2 :(得分:0)

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

paste age2.txt age3.txt | awk -F'\t' '{print $1, $1==$2?"passed":"failed"}'
相关问题