2016-06-09 67 views
-1

我想比較兩個文件,我需要從兩個文件打印匹配行。Awk打印來自兩個未排序文件的匹配行

文件1

a;c1|a|data 
a;c2|a|data 
b;c1|b|data 
b;c1|b|data 

文件2

a;c2|a_1|data 
b;c1|b_1|data 
a;c3|a_1|data 
b;c1|b_1|data 
a;c1|a_1|data 

輸出文件

a;c1|a|data 
a;c2|a|data 
b;c1|b|data 
b;c1|b|data 
a;c2|a_1|data 
b;c1|b_1|data 
b;c1|b_1|data 
a;c1|a_1|data 

你能幫幫我嗎?

+2

定義**匹配行**。 –

+2

你試過了什麼?你有沒有嘗試用'join',或者'comm',或者'diff'來解決這個問題?您的示例輸出似乎不支持「從兩個文件中打印匹配行」的問題定義。請通過改進的定義來更新您的問題以及嘗試解決您的問題。祝你好運。 – shellter

+0

謝謝你的迴應。我正在尋找與列1和3比較兩個未排序的文件並打印這兩個文件的輸出。我很抱歉輸出,因爲我剛剛複製文件。 – Aparna

回答

1
awk 'FNR==NR{a[$1,$3]=$0}FNR!=NR{if(a[$1,$3])print a[$1,$3] "\n" $0}' f1 f2 

第一組合存儲在第一文件(最後唯一的一行)對於一個給定 第一場&第三場。
第二種模式檢查是否在第一個文件中找到第二個文件中的第一個&第三個字段,如果是,則打印兩個文件。

(未測試)

+0

非常感謝您的回答。是否可以逐行打印而不是並排 – Aparna

+0

當然,我在打印語句中將逗號更改爲換行符 – tomc

+0

我很好奇,厭惡排序? – tomc

1

awk解決需要多遍,並gawk排序輸入選項,這裏是一個grep替代

$ function f(){ grep -f <(cut -d'|' -f1 "$2") "$1"; }; f file1 file2; f file2 file1 

a;c1|a|data 
a;c2|a|data 
b;c1|b|data 
b;c1|b|data 
a;c2|a_1|data 
b;c1|b_1|data 
b;c1|b_1|data 
a;c1|a_1|data 
+0

感謝您的回覆。但我正在尋找比較這兩個未排序的文件與列1和3,並使用awk命令打印這兩個文件的輸出。由於我需要比較更多的記錄,因此需要查找awk命令來比較未排序的文件。 – Aparna

+0

第3欄顯示「數據」。你確定它是關鍵的一部分嗎?上面的腳本僅用於第一個字段。不需要文件進行排序。還要注意你有重複的記錄(例如b; c1 | b | data)。 – karakfa

相關問題