2016-02-10 84 views
0

我有2個文件。 age2.txt & age3.txt
age2.txt如何使用awk比較和打印結果NR == FNR

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 

有人可以請幫助避免「失敗」線的重複?
預先感謝您:)

回答

0

你應該只需要添加一個nextFailed

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 
+0

@ I'L'l謝謝!有效。你能否給我一個文檔鏈接,以便更好地理解NR == FNR? – Salih

+0

@Salih:不客氣! –

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 
0

一個可能更簡單解決方案是結合這兩個文件s with paste

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

感謝rici。很好,這看起來很簡單。但是,當兩個文件中的可變分隔符都是空格''而不是'='時,我遇到了一個小問題。例如:a 30 b 23 c 33 d 43 ...等...在此示例中,比較總是「失敗」 – Salih

+0

如果變量separate是空格,則不應該有任何區別,但如果變量分隔符是製表符。如果間距不一致(有時一個空間,有時兩個),或者線上有尾隨空格,它也會失敗。基本上,你需要更仔細地觀察文件。 – rici