大家下午好,保留一對中的一個
我有一個包含兩個字段的文件,每個字段代表一對的成員。 我想保留每對中的一個成員,並且這些成員在研究中是重複樣本的代碼並不重要。
每個對在我的文件中出現兩次,每個對中的每個成員都出現在任一列中。
輸入文件的一個例子是:
XXX1 XXX7 XXX2 XXX4 abc2 dcb3 XXX7 XXX1 dcb3 abc2 XXX4 XXX2
和期望輸出的一個例子是
XXX1
XXX2
abc2
如何可能這在bash來完成?謝謝。
大家下午好,保留一對中的一個
我有一個包含兩個字段的文件,每個字段代表一對的成員。 我想保留每對中的一個成員,並且這些成員在研究中是重複樣本的代碼並不重要。
每個對在我的文件中出現兩次,每個對中的每個成員都出現在任一列中。
輸入文件的一個例子是:
XXX1 XXX7 XXX2 XXX4 abc2 dcb3 XXX7 XXX1 dcb3 abc2 XXX4 XXX2
和期望輸出的一個例子是
XXX1
XXX2
abc2
如何可能這在bash來完成?謝謝。
這裏是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
@Joni謝謝你的提示,我用一根管子更新了答案,這就像你的建議一樣。 –
雖然發表拉斯上述工程的答案很好,我想建議一個替代方案,以防萬一有人絆倒這個問題。
我之前使用過awk '!seen[$2,$1]++ {print $1}'
得到了相同的結果。由於我文件中的行數沒有減半,我沒有意識到它已經工作。原來,這是因爲我對數據做了一些錯誤的假設。
或者,'XXX4'應該在輸出中嗎?另外,每對是否在兩個方向都出現在文件中(如輸入示例中的那樣) – Joni
爲什麼輸出中的「xxx2」和「xxx4」?它們屬於集合{xxx2,xxx4}' –
我們可以通過排序來改變輸出序列嗎? –