2014-07-24 68 views
0

嗨,我想一個襯墊從兩個文件刪除重複的bash

刪除密鑰對重複

5和第6列是鍵值對

的awk「{打印$ 5 「\ t」$ 6}'file1 file2 |排序

64963661 3 
649963655 3 
649963655 8 
649963658 3 
649963658 3 
649963660 3 
649963660 3 
649963660 3 
649963661 3 

awk '{print $5"\t"$6}' file1 file2 | sort |uniq -d 
649963658 3 
649963660 3 

我必須得到下面的輸出(使用了重複

64963661 3 
649963655 3 
649963655 8 
649963661 3 
+0

爲什麼會是這樣期望的輸出?爲什麼缺少'649963660 3'?發佈包含6個或更多字段的實際樣本輸入文件以及該文件的預期輸出,以便我們更好地瞭解您要做什麼。 –

+0

輸入649963660 3649963660 3不包含在輸出中,它是一個重複的鍵值對。 –

+0

呵呵,所以你不只是想在先前出現的時候去除後面的值,你想在重複時刪除所有的值。得到它了。 –

回答

2

假設您想要打印的整個輸入線(如果不是,請更新您的問題):

awk '!seen[$5,$6]++' file1 file2 

鑑於你的更新問題:

$ awk '{cnt[$0]++} END{for (rec in cnt) if (cnt[rec] == 1) print rec}' file 
649963661 3 
649963655 8 
64963661 3 
649963655 3 

,如果你在乎保留輸入順序:

$ awk '!seen[$0]++{recs[++numRecs]=$0} {cnt[$0]++} END{for (recNr=1;recNr<=numRecs;recNr++) if (cnt[recs[recNr]] == 1) print recs[recNr]}' file 
64963661 3 
649963655 3 
649963655 8 
649963661 3 
+1

巧妙使用數組! –

+0

謝謝。這是一個非常常見的awk習慣用法,甚至是數組名'seen'。 –

+1

謝謝!這是一個很好的學習。 –

1

只要告訴排序使用5,6列並獨一無二:

sort -u -k5,6 file1 file2 
0

試試這個awk

awk '{ ++a[$5, $6]; b[$5, $6] = $0 } END { for (i in a) if (a[i] == 1) print b[i] }' file 

而且爲了:

awk '{ key = $5 "|" $6 } !a[key]++ { b[key] = $0; keys[i++] = key } END { for (i = 0; i in keys; ++i) { key = keys[i]; if (a[key] == 1) print b[key] } }' file