使用 LC_COLLATE 指定排序順序,因此小寫在大寫之前
給定文件:
$ cat file 1 a C B 2 c 3 A b
預設情況下
sort
將:$ sort file 1 2 3 a A b B c C
這樣將在小寫之前以
LC_COLLATE=C
大寫字母排序:$ LC_COLLATE=C sort file 1 2 3 A B C a b c
是否可以排序以反轉大小寫順序,即數字,小寫然後大寫?
我不知道預設情況下按該順序排序的任何語言環境。解決方案是創建具有自定義排序順序的自定義語言環境。四年後,如果有人想以自定義方式進行排序,這就是訣竅。
絕大多數語言環境不指定自己的排序順序,而是複制定義的排序順序,
/usr/share/i18n/locales/iso14651_t1_common
以便您要編輯。與其通過修改原始文件來更改幾乎每個語言環境的排序順序iso14651_t1_common
,我建議您製作一份副本。有關排序順序如何工作以及如何在$HOME
沒有 root 訪問權限的情況下在您的目錄中創建自定義區域設置的詳細資訊,請參閱此類似問題的答案。看看如何根據他們在以下條目中的條目進行
a
排序:A``iso14651_t1_common
<U0061> <a>;<BAS>;<MIN>;IGNORE # 198 a <U0041> <a>;<BAS>;<CAP>;IGNORE # 517 A
b
並且B
是相似的:<U0062> <b>;<BAS>;<MIN>;IGNORE # 233 b <U0042> <b>;<BAS>;<CAP>;IGNORE # 550 B
我們在第一遍看到,兩者都
a
具有A
整理符號<a>
,而兩者都b
具有B
整理符號<b>
。由於<a>
出現在<b>
in之前iso14651_t1_common
,a
並且在andA
之前並列。第二遍不會打破平局,因為所有四個字元都有整理符號,但在第三遍期間,平局被解決,因為小寫字母的整理符號出現在第 3467 行,在大寫字母的整理符號之前(第 3488 行) . 所以排序順序最終為, , , 。b``B``<BAS>``<MIN>``<CAP>``a``A``b``B
交換第一個和第三個整理符號將首先按大小寫(從小到大)對字母進行排序,然後按重音(
<BAS>
表示非重音),然後按字母順序。 但是,兩者都<MIN>
出現<CAP>
在數字之前,因此這會產生將數字放在字母之後的不良影響。在使所有小寫字母排在所有大寫字母之前,保持數字優先的最簡單方法是通過將所有字母都設置為 來強制所有字母在第一次比較期間打成平手
<a>
。為了確保它們在大小寫中按字母順序排序,請將最後一個整理符號從IGNORE
更改為目前的第一個整理符號。按照這種模式,a
將變為:<U0061> <a>;<BAS>;<MIN>;<a> # 198 a
A
會成為:<U0041> <a>;<BAS>;<CAP>;<a> # 517 A
b
會成為:<U0062> <a>;<BAS>;<MIN>;<b> # 233 b
B
會成為:<U0042> <a>;<BAS>;<CAP>;<b> # 550 B
其餘的字母依此類推。
創建自定義版本後
iso14651_t1_common
,請按照上面連結的答案中的說明編譯您的自定義語言環境。