簡體   English   中英

比較同一文件中的多列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM