GNU sortiert kyrillische Zeilen unter Berücksichtigung der Groß-/Kleinschreibung

GNU sortiert kyrillische Zeilen unter Berücksichtigung der Groß-/Kleinschreibung

Ich habe eine Datei in UTF-8 mit Zeilen lateinischer oder kyrillischer Buchstaben. Ich versuche, sie zu sortieren, ohne auf Groß- und Kleinschreibung zu achten.

Ich habe versucht

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

Aber die kyrillischen Zeilen sind immer noch in der falschen Reihenfolge, während die lateinischen Zeilen ordnungsgemäß sortiert sind.

Beispiel einer sortierten Datei:

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

Wie kann ich das schaffen? Vielen Dank im Voraus.

Antwort1

Ich vermute, dass „ru“ kein gültiges Gebietsschema ist. Probieren Sie den Befehl aus lang=ru localeund prüfen Sie, ob Fehlermeldungen angezeigt werden. Auf meinem System ist „ru“ ein ungültiges Gebietsschema und „ru_RU“ ist in iso8859-5; Sie benötigen ru_RU.UTF-8, damit es in UTF-8 funktioniert.

$ 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

Um den für ein Gebietsschema verwendeten Zeichensatz zu ermitteln, können Sie das folgende localeTool verwenden:

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

Beachten Sie, dass Gebietsschemata in Kategorien definiert werden. Die Kategorie LC_COLLATE wird zum Sortieren verwendet. Wenn Sie LC_ALL festlegen, werden alle überschrieben. Sie können auch ein Gebietsschema einzeln festlegen, indem Sie die benannte Umgebungsvariable verwenden. Sie können auch einen Standard festlegen, indem Sie LANG festlegen. Die meisten Benutzer werden LANG für den täglichen Gebrauch anstelle von LC_ALL festlegen wollen.

In der Ausgabe des localeTools werden Kategorien, die auf LC_ALL oder LANG basieren, in Anführungszeichen angezeigt, während Kategorien, die durch ihre eigenen Variablen (und LC_ALL selbst, wenn festgelegt, und LANG, wenn LC_ALL nicht festgelegt ist) festgelegt werden, ohne Anführungszeichen angezeigt werden. Beispiel:

$ 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=

Antwort2

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

verwandte Informationen