2016-11-24 53 views
0

如果我運行這種:有一種意外的結果-u

printf "Will be second line post-sort\nWill be first line post-sort" \ 
    | sort -k1,1 

我得到的輸出:

Will be first line post-sort 
Will be second line post-sort 

預期(關鍵字段相同,但排序使用最後手段比較)。但是,如果我添加了-u選項:

printf "Will be second line post-sort\nWill be first line post-sort" \ 
    | sort -k1,1 -u 

我得到的輸出繼電器:

Will be second line post-sort 

,而不是預期:

Will be first line post-sort 

爲什麼排序-u返回的第一行預排序數據,而不是本例中排序後數據的第一行?

BTW,我可以通過排序(不帶-u)獲得所需的行爲第一:

printf "Will be second line post-sort\nWill be first line post-sort" \ 
    | sort -k1,1 | sort -k1,1 -u 
+0

這是一個實現工件。 POSIX [不提供任何保證](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html)關於選擇具有相同密鑰的多行中的哪一行。你不能依靠它。 –

回答

3

我不認爲你可以依靠精確其中一條是在輸出中。 POSIX說:

-u
        獨特:抑制每組具有相等的鍵線的所有,但一個。

它不會說輸出中有哪個具有相同鍵的行將只在其中有一個。所以如果你想要一個特定的工具,你應該使用其他工具,如awk

+0

我對源代碼進行了排序(我應該先完成此操作),看起來在排序過程中排除了重複項,而不是在之前。儘管如此,你是絕對正確的,不能保證具有相同密鑰的行之間的哪一行會得到輸出。我的這種心理模型是,它的實施與uniq類似。在遇到問題之前,很高興知道這種微妙的差異! – cromulent