2011-06-10 172 views

回答

7

您可以使用管道,但它不適用。

例子:

$ cat initial.txt 
1,3,4 
2,3,1 
1,2,3 
2,3,4 
1,4,1 
3,1,3 
4,2,4 

$ cat initial.txt | sort -u -t, -k1,1 | sort -t, -k2,2 
3,1,3 
4,2,4 
1,3,4 
2,3,1 

結果由鍵2,鍵1注獨特之處在於結果顯示在控制檯上,如果你想在一個文件,只需使用重定向排序(> newFiletxt

對於這種更復雜的操作的另一個解決辦法是靠另一個工具(根據您的喜好(和年齡)時,awk,Perl或Python)

編輯: 如果我理解正確了新的要求,它是由科拉姆2排序,列1是給定列2獨特:

$ cat initial.txt | sort -u -t, -k1,2 | sort -t, -k2,2 
3,1,3 
1,2,3 
4,2,4 
1,3,4 
2,3,1 
1,4,1 

難道你期待什麼?否則,我不明白:-)

+2

感謝布魯斯的回答。嗯......但我的情況下需要先排序然後uniq。這意味着第一列可能有重複的值,但不能彼此相鄰。還有什麼想法?我是awk的初學者,但是如果你有一個好的解決方案。我想用它。謝謝。 – Ken 2011-06-10 05:26:08

+0

您能否提供數據樣本和預期結果,例如:在http://pastebin.com上?我不確定我是否完全明白 – Bruce 2011-06-10 05:31:33

+0

酷......這一個適合我......雖然它沒有足夠強大的非連續列。它會爲我目前的任務做。感謝堆。 – Ken 2011-06-10 05:40:55

0

uniq需要數據按排序順序工作,所以如果您在第二個字段上使用sort,然後在第一個字段上應用uniq,您將無法獲得正確的結果。

你可能想嘗試

sort -u -t, -k1,1 filename | sort -t, -k2,2 
+1

謝謝Lobo ..但我需要先進行排序然後找到第一列中可能存在重複值的第一列中的唯一值,但它們不會緊挨着每一列其他。我很驚訝Linux中的uniq命令沒有指定特定列的參數。謝謝。 – Ken 2011-06-10 05:30:10

+0

'uniq'命令可以給你選擇字段的選項。看看'-f','s'和其他選項。你在尋找'sort -t''-k2,2 b | uniq -f1'?你能提供一個你正在尋找的輸入和輸出的例子嗎? – Lobo 2011-06-10 05:40:36

+0

,但'-f'和'-s'將跳過第一個數字的列/字符以進行唯一性比較。他們不允許特定的列。布魯斯的第二個答案現在適用於我目前的任務。謝謝。 – Ken 2011-06-10 05:48:56

0

只是可以肯定的是我得到了你的意思是正確的。您想基於文件中的第二列對文件進行排序。然後你想刪除第一列中的重複項(另一種說法是將uniq應用於第一列!)。冷靜,要做到這一點,你需要執行三項任務:

  1. 排序上的uniq將被應用的列(因爲只有在排序輸入的uniq可以 工作)。
  2. 在排序的列上應用uniq。
  3. 根據第二列中的值對輸出進行排序。

使用管道:該命令

sort -t ',' -k1 fileName| awk '!x[$1]++' | sort -t ',' -k2 

請注意,你不能在指定的uniq第一場,你可以使用-f開關跳第一n領域。因此,我用awk來代替uniq

+0

你能解釋一下awk命令嗎? – 2018-03-06 16:45:45

0

我用這個 sort -t ',' -nk2

這裏排序

1,2 
2,5 
3,1 

to 

3,1 
1,2 
2,5