Gnu coreutils est-il cassé?

10

Tenez compte de l'entrée suivante pour trier:

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

Maintenant, essayez de courir sort foo

La sortie n'est pas triée lorsque j'essaye ceci sur aucune de mes boîtes Linux (gnu coreutils versions 6.9-7.4). La sortie est triée lorsqu'elle est exécutée sous cygwin (gnu coretuils 8.5). Commentaires?

Leo Alekseyev
la source

Réponses:

18

Le tri dépend des paramètres régionaux; en particulier, cela dépend de $LC_COLLATE(éventuellement remplacé par $LC_ALL), retombant $LANGs'il n'existe pas. La commande localevous montrera les valeurs avec lesquelles vous travaillez efficacement. Voir man 3 strcoll, man 3 setlocaleetc.

LC_COLLATE=C(ou POSIXpas de paramètres régionaux du tout) entraîne une comparaison stricte octet par octet.

LC_COLLATE=en_US.utf8 entraîne un tri d'équivalence alphabétique, la ponctuation étant ignorée et les caractères de la même classe d'équivalence traités de manière égale.

éphémère
la source
En effet, export LC_COLLATE=Cfait se comporter comme prévu
Leo Alekseyev
3
Les accents ne sont pas complètement ignorés. Stephanetrie avant Stéphane , mais Stephanietrie après Stéphane. éest équivalent à e(comme ê, ë, ...), mais s'il y a égalité, l'ordre entre ceux est bien défini. C'est la même chose dans un bon vieux dictionnaire papier.
Stéphane Chazelas
Si vous voulez vraiment tout savoir: unicode.org/reports/tr10
Martin Tournoij