Ist Gnu Coreutils Art gebrochen?

10

Betrachten Sie die folgende Eingabe zum Sortieren:

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

Versuchen Sie jetzt zu laufen sort foo

Die Ausgabe wird nicht sortiert, wenn Sie dies auf einer meiner Linux-Boxen versuchen (gnu coreutils Versionen 6.9-7.4). Die Ausgabe wird sortiert, wenn sie unter Cygwin ausgeführt wird (gnu coretuils 8.5). Bemerkungen?

Leo Alekseyev
quelle

Antworten:

18

Die Sortierung hängt vom Gebietsschema ab. Insbesondere hängt es davon ab $LC_COLLATE(möglicherweise überschrieben von $LC_ALL), auf was zurückzugreifen, $LANGwenn es nicht existiert. Der Befehl localezeigt Ihnen, mit welchen Werten Sie effektiv arbeiten. Siehe man 3 strcoll, man 3 setlocaleusw.

LC_COLLATE=C(oder POSIXgar kein Gebietsschema) führt zu einem strengen Byte-für-Byte-Vergleich.

LC_COLLATE=en_US.utf8 führt zu einer alphabetischen Äquivalenzsortierung, bei der Interpunktion ignoriert und Zeichen innerhalb derselben Äquivalenzklasse gleich behandelt werden.

kurzlebig
quelle
In der Tat, export LC_COLLATE=Cmacht Sortieren wie erwartet
Leo Alekseyev
3
Akzente werden nicht vollständig ignoriert. Stephanesortiert vorher Stéphane , Stephaniesortiert aber danach Stéphane. éentspricht e(wie ê, ë, ...), aber wenn eine Bindung da ist, dann ist die Reihenfolge zwischen den gut definiert. In einem guten alten Papierwörterbuch ist es dasselbe.
Stéphane Chazelas
Wenn Sie wirklich alles wissen wollen: unicode.org/reports/tr10
Martin Tournoij