GNU ordena linhas cirílicas ignorando o caso

2

Eu tenho um arquivo em UTF-8 com linhas de letras latinas ou cirílicas. Estou tentando resolver isso, ignorando o caso.

Eu tentei

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

mas ainda tem linhas cirílicas em ordem inadequada, enquanto linhas em latim são classificadas bem.

Exemplo de arquivo classificado:

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

Como posso gerenciar isso? Obrigado antecipadamente.

    
por tkhomas 20.04.2015 / 12:15

2 respostas

3

Eu suspeito que "ru" não seja uma localidade válida. Experimente o comando lang=ru locale e veja se há alguma mensagem de erro. No meu sistema, "ru" é uma localidade inválida e "ru_RU" está em iso8859-5; você precisa do ru_RU.UTF-8 para funcionar em 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

Para encontrar o conjunto de caracteres usado para uma localidade, você pode usar a ferramenta locale :

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

Observe que as localidades são definidas em categorias. A categoria LC_COLLATE é a usada para classificação. A configuração de LC_ALL substituirá todos eles ou você pode definir um individualmente usando a variável de ambiente nomeada ou pode definir um padrão configurando LANG. A maioria das pessoas vai querer definir LANG para uso diário em vez de LC_ALL.

Na saída da ferramenta locale , as categorias definidas com base em LC_ALL ou LANG aparecerão entre aspas, enquanto as categorias serão definidas por suas próprias variáveis (e o próprio LC_ALL, se definido, e LANG, se LC_ALL não estiver definido) vai aparecer sem aspas. Por exemplo:

$ 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=
    
por 20.04.2015 / 16:18
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
арбуз
Арбуз
банан
Банан
кофе
Кофе
    
por 20.04.2015 / 14:20