O gnu coreutils está quebrado?

10

Considere a seguinte entrada para classificar:

cat > foo <<EOM
D,,5014978
DD,,25
D,I,1972765530
D,Y,4223624
-,Y,71285059
YA,I,2
EOM

Agora tente correr sort foo

A saída não é classificada ao tentar isso em qualquer uma das minhas caixas Linux (gnu coreutils versões 6.9-7.4). A saída é classificada quando executada no cygwin (gnu coretuils 8.5). Comentários?

Leo Alekseyev
fonte

Respostas:

18

A classificação depende do código do idioma; especificamente, depende $LC_COLLATE(possivelmente substituído por $LC_ALL), voltando a $LANGse não existir. O comando localemostrará quais valores você está efetivamente trabalhando. Veja man 3 strcoll, man 3 setlocaleetc.

LC_COLLATE=C(ou POSIXnenhuma localidade) resulta em uma comparação estrita de bytes por bytes.

LC_COLLATE=en_US.utf8 resulta em uma classificação de equivalência alfabética, com pontuação ignorada e caracteres dentro da mesma classe de equivalência tratados igualmente.

efémero
fonte
De fato, export LC_COLLATE=Cfaz o tipo se comportar conforme o esperado #
Leo Alekseyev
3
Os acentos não são completamente ignorados. Stephaneclassifica antes Stéphane , mas Stephaniedepois Stéphane. éé equivalente a e(como ê, ë, ...), mas se houver um empate, então a ordem entre os que está bem definida. É o mesmo em um bom e velho dicionário de papel.
Stéphane Chazelas
Se você realmente quer saber tudo: unicode.org/reports/tr10 #
Martin Tournoij