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, если установлено, и LANG, если LC_ALL не установлено), будут отображаться без кавычек. Например:

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

Связанный контент