Sort
奇怪的行為
我使用的是 Ubuntu 18.04 和預設的 coreutils。我注意到命令的特定行為,
sort
我不確定如何解釋。考慮以下命令:
$ cat <<EOF | sort 0- 01- EOF 0- 01-
這個輸出是有意義的,因為
-
它的 ASCII 值比1
預期的要小。但是,如果我在最後添加一個字元:
$ cat <<EOF | sort 0-T 01-T EOF 01-T 0-T
這個輸出對我來說沒有任何意義,因為我認為
0-T
應該首先出現。為什麼會這樣。我在這裡想念什麼?我有錯誤的期望嗎?
這取決於您的語言環境的整理順序。
排序順序是每個語言環境的一組規則,允許對重音字母進行排序(例如,在西班牙語
ñ
中將在之後n
但在之前)。o
但這不是它,排序規則還說明了排序時要忽略哪些字元。對於區域設置“C”,所有字元都被考慮在內,但對於例如“en_US”,破折號 (U002D) 將被忽略,與大多數其他區域設置一樣,因為它們繼承了 iso14651_t1_common 的定義(在 /usr/share/ i18n/locales/ 在某些發行版中)。
因此,您的第一個文件的排序沒有問題,因為當您忽略破折號時,您最終會得到一個簡單的字母比較:
-- ignore dashes --> -- sort --> 0- 0 0 01- 01 01
當您添加“T”時,情況會發生變化,為什麼?因為現在,如果您忽略破折號,則必須比較“1”和“T”(第一個字元相同)並且“1”在“T”之前:
-- ignore dashes --> -- sort --> 0-T 0T 01T 01-T 01T 0T
因此,最好始終確保使用“C”的規則,在排序時使用 LC_COLLATE=C。
在你的情況下:
$ cat <<EOF | LC_COLLATE=C sort 0-T 01-T EOF
產量:
0-T 01-T
如你所料。