GNU 將西里爾字母行排序,忽略大小寫

GNU 將西里爾字母行排序,忽略大小寫

我有一個 UTF-8 格式的文件,其中包含多行拉丁字母或西里爾字母。我正在嘗試對其進行排序,忽略此案。

我努力了

LC_ALL="ru" sort --ignore-case in.txt

但西里爾文行的順序仍然不正確,而拉丁文行則排序良好。

排序文件的範例:

Apple
apple
Banana
banana
...
// but with cyrillic letters i got this:
...
Арбуз
Банан
арбуз
банан

我該如何處理這個問題?先感謝您。

答案1

我懷疑「ru」不是有效的語言環境。嘗試該命令lang=ru locale並查看是否有任何錯誤訊息。在我的系統上,「ru」是無效的語言環境,「ru_RU」位於 iso8859-5 中;你需要 ru_RU.UTF-8 才能在 utf-8 中工作。

$ LANG=ru locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

若要尋找用於區域設定的字元集,您可以使用下列locale工具:

$ LANG=ru_RU locale -c -k charmap collate-codeset
LC_CTYPE
charmap="ISO-8859-5"
LC_COLLATE
collate-codeset="ISO-8859-5"

請注意,區域設定是在類別中定義的。 LC_COLLATE 類別是用於排序的類別。設定 LC_ALL 將覆蓋所有這些,或者您可以使用指定的環境變數單獨設定一個,也可以透過設定 LANG 設定預設值。大多數人會希望將 LANG 設定為日常使用,而不是 LC_ALL。

在該工具的輸出中locale,基於 LC_ALL 或 LANG 設定的類別將顯示在引號中,而由其自己的變數設定的類別(如果設定了 LC_ALL 本身,如果未設定 LC_ALL 則顯示 LANG)將顯示不含引號。例如:

$ LANG=en_US.UTF-8 LC_MESSAGES=ru_RU.UTF-8 locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
...
LC_MESSAGES=ru_RU.UTF-8
...
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

答案2

$ cat input.txt 
banana
coffee
кофе
Банан
Apple
Coffee
арбуз
apple
Banana
Кофе
банан
Арбуз

$ export LC_ALL=en_US.UTF-8 && sort --ignore-case input.txt
apple
Apple
banana
Banana
coffee
Coffee
арбуз
Арбуз
банан
Банан
кофе
Кофе

相關內容