[英]Comparing multiple columns within same file
我必須比較兩列col1和col2,這樣,如果A與B一起出現,並且再次出現與B緊隨其后的A,那么后面的所有列應該只打印一對
Input file:
A B 13.2 0.24 posx 209 215 posy 145 155
B A 13.2 0.24 posy 145 155 posx 209 215
A D 19.4 0.28 posx 209 215 posz 366 368
Required output:
A B 13.2 0.24 posx 209 215 posy 145 155
A D 19.4 0.28 posx 209 215 posz 366 368
輸入文件非常大(〜10gb)。
這是使用awk
一種方法:
awk '!(a[$1,$2]++ || a[$2,$1]++)' file
A B 13.2 0.24 posx 209 215 posy 145 155
A D 19.4 0.28 posx 209 215 posz 366 368
我們通過將它們用作數組a
鍵來跟蹤第1列和第2列。 ++
會在遇到按鍵時增加它們的值。 ||
是一個短路運算符,如果第一個條件為假,則僅會為第二個條件觸發。
我們使用!
取反條件輸出!
。 由於awk
默認行為是在真相上打印行,因此我們可以使用它來避免顯式print
語句。
它從每一行中獲取前兩個值,並形成用於過濾掉重復項的排序鍵,
perl -ane '@k = sort @F[0,1]; $s{"@k"}++ or print' file
輸出
A B 13.2 0.24 posx 209 215 posy 145 155
A D 19.4 0.28 posx 209 215 posz 366 368
$ awk '!a[$1,$2];{a[$2,$1]++}' file
A B 13.2 0.24 posx 209 215 posy 145 155
A D 19.4 0.28 posx 209 215 posz 366 368
通常情況下a
將被命名seen
,但我部分地打高爾夫球與@ jaypal的回答所以需要讓我的行程下來:-)。
兩個答案之間的重要區別在於,他們如何對待以與上一行相同的兩個鍵值開頭的第二行。 jaypals答案不包括以任何順序匹配先前看到的$ 1和$ 2的行,因此它將刪除重復項,而我嚴格遵守發布的問題,並且僅刪除先前看到反向鍵的后續行(即當前$ 1 $ 2 =先前$ 2 $ 1 )。
為了增強上述效果,將重復項排除在外(替代):
$ awk '!a[$1,$2]++;{a[$2,$1]++}' file
可能輸入中永遠不會有重復,因此這兩種方式都可能無關緊要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.