2016-04-11 63 views
1

大家下午好,保留一對中的一個

我有一個包含兩個字段的文件,每個字段代表一對的成員。 我想保留每對中的一個成員,並且這些成員在研究中是重複樣本的代碼並不重要。

每個對在我的文件中出現兩次,每個對中的每個成員都出現在任一列中。

輸入文件的一個例子是:

XXX1 XXX7 XXX2 XXX4 abc2 dcb3 XXX7 XXX1 dcb3 abc2 XXX4 XXX2

和期望輸出的一個例子是

XXX1 
XXX2 
abc2 

如何可能這在bash來完成?謝謝。

+2

或者,'XXX4'應該在輸出中嗎?另外,每對是否在兩個方向都出現在文件中(如輸入示例中的那樣) – Joni

+1

爲什麼輸出中的「xxx2」和「xxx4」?它們屬於集合{xxx2,xxx4}' –

+0

我們可以通過排序來改變輸出序列嗎? –

回答

2

這裏是GNU AWK的組合,切割和排序,存儲素文字爲duplicatePairs.awk

{ if ($1 < $2) print $1, $2 
     else print $2, $1 
    } 

像這樣運行:awk -f duplicatePairs.awk your_file | sort -u | cut -d" " -f1

的,如果排序的對,這樣用線x,y和一行y,x將打印相同。然後sort -u可以刪除重複的行。 cut選擇第一列。


隨着稍大awk腳本,就可以解決要求 「AWK-ONLY」:這樣

{ 
    smallest = $1; 
    if ($1 > $2) { 
     smallest = $2 
    } 

    if(!(smallest in seen)) { 
     seen [ smallest ] = 1 
     print smallest 
    } 
    } 

運行:awk -f duplicatePairs.awk your_file

+0

@Joni謝謝你的提示,我用一根管子更新了答案,這就像你的建議一樣。 –

0

雖然發表拉斯上述工程的答案很好,我想建議一個替代方案,以防萬一有人絆倒這個問題。

我之前使用過awk '!seen[$2,$1]++ {print $1}'得到了相同的結果。由於我文件中的行數沒有減半,我沒有意識到它已經工作。原來,這是因爲我對數據做了一些錯誤的假設。