A implementação GNU de uniq
como encontrada no Ubuntu, com -c
, não reporta contagens de linhas idênticas contíguas, mas conta com linhas contíguas que ordenam o mesmo.
A maioria das localidades internacionais nos sistemas GNU tem esse bug que muitos caracteres completamente não relacionados foram definidos com a mesma ordem de classificação, porque sua ordem de classificação não é definida. A maioria dos outros sistemas operacionais garante que todos os caracteres tenham uma ordem de classificação diferente.
$ expr ܐ = ܒ
1
( expr
' =
operator, para argumentos que não são numéricos, retorna 1 se operandos ordenarem o mesmo, 0 caso contrário).
É o mesmo com ar_SY.UTF-8
ou en_GB.UTF-8
.
O que você precisa é de uma localidade em que esses caracteres recebam uma ordem de classificação diferente. Se o Ubuntu tivesse localidades para o idioma siríaco, você poderia esperar que esses caracteres tivessem uma ordem de classificação diferente, mas o Ubuntu não tem essas localidades.
Você pode examinar a saída de locale -a
para obter uma lista de localidades suportadas. Você pode ativar mais locales executando dpkg-reconfigure locales
as root
. Você também pode definir mais localidades manualmente usando localedef
com base nos arquivos de definição em /usr/share/i18n/locales
, mas não encontrará dados para a linguagem Siríaco.
Observe que em:
LC_COLLATE=syr_SY.utf8 cat file.txt | sort | uniq -c
Você só está configurando a variável LC_COLLATE para o comando cat
(o que não afeta a maneira como ela gera o conteúdo do arquivo, cat
não se importa com o agrupamento nem mesmo com a codificação de caracteres, pois não é utilitário de texto). Você deseja configurá-lo para sort
e uniq
. Você também deseja definir LC_CTYPE
para uma localidade que tenha um conjunto de caracteres UTF-8.
Como seu sistema não tem syr_SY.utf8
locale, é o mesmo que usar o C
locale (o local padrão).
Na verdade, aqui a localidade C ou C.UTF-8 é provavelmente a localidade que você gostaria de usar.
Nesses locais, a ordem de intercalação é baseada no ponto de código, ponto de código Unicode para C.UTF-8, valor de byte para C, mas isso acaba sendo o mesmo que a codificação de caracteres UTF-8 tem essa propriedade. / p>
$ LC_ALL=C expr ܐ = ܒ
0
$ LC_ALL=C.UTF-8 expr ܐ = ܒ
0
Então, com:
(export LANG=ar_SY.UTF-8 LC_COLLATE=C.UTF-8 LANGUAGE=syr:ar:en
unset LC_ALL
sort <file | uniq -c)
Você teria um LC_CTYPE com UTF-8 como o conjunto de caracteres, uma ordem de agrupamento com base no ponto de código e outras configurações relevantes para sua região, portanto, por exemplo, mensagens de erro em siríaco ou árabe se GNU coreutils sort
ou uniq
mensagens foram traduzidas nesses idiomas (ainda não foram).
Se você não se importa com essas outras configurações, é tão fácil (e também mais portátil) usar:
<file LC_ALL=C sort | LC_ALL=C uniq -c
Ou
(export LC_ALL=C; <file sort | uniq -c)
como @isaac já mostrou.