用awk

2014-12-24 22 views
2

我想比較兩個不同的文件比較兩個文件的兩列,讓我們說「文件1」和「文件2」,以這種方式。 如果字段$ 2和$ 3在兩個文件中都相同,則輸出file2的$ 0。這裏有一個例子:用awk

file1 
E 352 697 
E 25 692 
E 510 744 

file2 
E 335 705 1 1 
E 267 792 1 2 
E 365 395 1 3 
E 25 692 1 4 
E 566 624 1 5 
E 227 358 1 6 
E 516 554 1 7 
E 510 744 1 8 
E 234 790 1 9 
E 352 697 1 10 

所需的輸出:

E 352 697 1 10 
E 25 692 1 4 
E 510 744 1 8 

請注意,所有夫婦$ 2,$ 3文件1中包含的文件2和輸出文件的行數是相同的文件1的。 有很多類似問題的問題,我知道,但所有的答案都沒有用。 我曾嘗試使用:

awk 'FNR==NR {a[$2]; b[$3]; next} $2 in a && $3 in b' file1 file2 > output 

它的工作原理,但在輸出文件中有多餘的行。你可以幫幫我嗎?謝謝!

+0

但劇本給了我所需的輸出。你的意思是多行? – nu11p01n73R

+0

我已經把文件只是一些線條,原來的有大得多。它意味着,在輸出文件中有沒有對文件1存在於文件2行。我想這是因爲$ 2或$ 3出現在file1中,但不是同時出現 – Anna

回答

2
awk 'NR==FNR{a[$2,$3];next} ($2,$3) in a' file1 file2 
+1

我這個解決方案達成一致。其實這與我的第一次試用相似,但我在語法上犯了一些錯誤。謝謝! – Anna

2

awk應該做的:

awk 'FNR==NR {a[$0];next} {for (i in a) if ($0~i) print}' file1 file2 
E 25 692 1 4 
E 510 744 1 8 
E 352 697 1 10 

它存儲在file1陣列a。然後循環槽file2和測試,如果它包含從陣列a數據,如果是,打印線。

+0

它正常工作!謝謝 – Anna

+0

不,它只是產生您期望從當前發佈的示例輸入中獲得的輸出。它會失敗,並有其他輸入集合,例如當file1包含一行像'E 352 69'。 –

+0

@EdMorton我明白爲什麼它不應該從您的評論工作,但如果我改變'f1'到'é352 69'它不打印線,並給出相同的輸出解決方案。你能幫我理解爲什麼它看起來有效,什麼時候它不應該工作。 – Jotne