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 です。utf-8 で動作させるには、ru_RU.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 を設定してデフォルトを設定することもできます。ほとんどの人は、日常の使用には LC_ALL ではなく LANG を設定するでしょう。

ツールの出力では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
арбуз
Арбуз
банан
Банан
кофе
Кофе

関連情報