Czy gnu coreutils są zepsute?

10

Rozważ następujące dane wejściowe do sortowania:

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

Teraz spróbuj uruchomić sort foo

Dane wyjściowe nie są sortowane, gdy próbuję tego na jednym z moich systemów Linux (GNU Coreutils wersje 6.9-7.4). Dane wyjściowe są sortowane po uruchomieniu pod cygwin (gnu coretuils 8.5). Komentarze?

Lew Aleksiejjew
źródło

Odpowiedzi:

18

Sortowanie zależy od ustawień regionalnych; w szczególności zależy od $LC_COLLATE(być może przesłoniętego $LC_ALL), cofania się, $LANGjeśli nie istnieje. Polecenie localepokaże, z jakimi wartościami efektywnie pracujesz. Zobacz man 3 strcoll, man 3 setlocaleitp

LC_COLLATE=C(lub POSIXbrak ustawień regionalnych) powoduje ścisłe porównanie bajtów po bajcie.

LC_COLLATE=en_US.utf8 powoduje sortowanie według alfabetycznej równoważności, ignorowanie interpunkcji i równe traktowanie znaków w tej samej klasie równoważności.

efemeryczny
źródło
Rzeczywiście, export LC_COLLATE=Csprawia , że sort zachowuje się zgodnie z oczekiwaniami
Lew Aleksiejew
3
Akcenty nie są całkowicie ignorowane. Stephanesortuje przed Stéphane , ale Stephaniesortuje po Stéphane. éjest równoważna e(jak ê, ë, ...), ale jeśli jest remis, wówczas kolejność między tymi, jest dobrze zdefiniowana. Tak samo jest w starym dobrym słowniku papierowym.
Stéphane Chazelas
Jeśli naprawdę chcesz to wszystko wiedzieć: unicode.org/reports/tr10
Martin Tournoij