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
арбуз
Арбуз
банан
Банан
кофе
Кофе

相关内容