2017-04-23 70 views
-1

大問題: 我想要一個數據框中兩個字段之間的唯一組合列表。awk從2列刪除鏡像副本

示例數據:

A B 
C D 
E F 
B A 
C F 
E F 

我希望能夠得到的4種獨特的組合結果:AB,CD,EF,和CF.由於BA和和BA含有相同的成分,但以不同的順序,我只想要一個副本(它是如此BA相互關係是一回事AB)

嘗試:

到目前爲止,我已經嘗試排序,並保持獨特行:

sort file | uniq 

當然能產生5種組合,但:

A B 
C D 
E F 
B A 
C F 

我不知道如何處理AB/BA被認爲是一樣的。有關如何做到這一點的任何建議?

+1

是否真實數據只有兩個字符,也可以是兩個以上的? –

+0

@George對不起,我沒有指定 - 真正的數據是每列多個字符,但詹姆斯和埃德提供了適用於多個字符的答案 – user4670961

+1

我建議包括一個多字符樣本輸入/期望輸出;是可能的一些解決方案打破多個字符... –

回答

3

慣用AWK的方法是安排索引部分:

$ awk '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file 
A B 
C D 
E F 
C F 
+0

是否將數組中的實際數據存儲爲只保留索引?在我看來,在看過的{next} $ 2 FS $ 1中看到{awk'$ 1 FS $ 2} {看過[$ 1 FS $ 2]} {'看過[1 $ FS $ 2]} 1'文件'會更容易記憶,儘管它還有更多碼。 – ghoti

+1

'seen'將包含完全相同的值,無論是$ 1,$ 2對的唯一集合。哦,我明白你在說什麼 - 不需要保持計數。這將是海洋的下降,稍微提高效率的內存略多一些。 –

2

在awk中:

$ awk '($1$2 in a){next}{a[$1$2];a[$2$1]}1' file 
A B 
C D 
E F 
C F 

解釋:

($1$2 in a) { next }  # if duplicate in hash, next record 
{ a[$1$2]; a[$2$1] } 1 # hash reverse also and output 

它適用於單個字符的字段。如果你想使用它更長的字符串,請在字段之間添加FS,如a[$1 FS $2]等(謝謝@EdMorton)。

+0

@ghoti它是如何有用或建設性的取笑我?我只是在學習編碼,並努力按照本網站概述的結構以有組織的方式提出問題。這是我正在研究的主要使用awk的更長時間問題的最後一步。如果你沒有什麼好說的話,請隨時保留! – user4670961

+2

@EdMorton True,true。 –

+2

你在1之前的解決方案中忘記了'||'嗎?你已經將它包含在你的解釋中,但不包含在你的代碼中。 –

3

另一awk魔術

awk '!a[$1,$2] && !a[$2,$1]++' file