Sort

奇怪的行為

  • April 1, 2020

我使用的是 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

如你所料。

引用自:https://unix.stackexchange.com/questions/577192