Linux

使用 LC_COLLATE 指定排序順序,因此小寫在大寫之前

  • July 7, 2021

給定文件:

$ 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_commona並且在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,請按照上面連結的答案中的說明編譯您的自定義語言環境。

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