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?

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.