web-dev-qa-db-fra.com

Mauvais comportement de la commande de tri?

J'ai essayé de trier le contenu d'un fichier dans Bureau Ubuntu 14.04 (Trusty Tahr). Dans mon cas, le résultat attendu devrait être identique au contenu d'origine, mais le résultat réel ne l'est pas. Pourquoi?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c
13
user2909884

Vous pouvez utiliser la variable LC_ALL, définissez-la sur LC_ALL=C avant d'appeler sort.

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

Lire this répondre, si vous voulez savoir quelle est cette magie LC_ALL=C. Voici un bref résumé:

Les paramètres régionaux C sont des paramètres régionaux spéciaux censés être les paramètres régionaux les plus simples. Vous pouvez également dire que, si les autres paramètres régionaux sont destinés aux humains, les paramètres régionaux C sont destinés aux ordinateurs. Dans les paramètres régionaux C, les caractères sont des octets simples, le jeu de caractères est ASCII, l'ordre de tri est basé sur les valeurs d'octet.

En outre, comme l'a souligné @KenMollerup, citez un extrait de man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

Ainsi, lorsque vous utilisez le tri avec LC_ALL=C, triez les symboles de comparaison bytewise. Sinon, sort ignorera tous les caractères non alphanumériques.

16
c0rp

Le tri utilise le tri alphabétique et numérique, comme chez nous, les caractères spéciaux comme + - <> ... sont ignorés, les chiffres sont traités de manière numérique, donc 1, 2, 3 .. vient avant le 11, 12 1066 1104 - vous voyez!

Donc, votre liste est vue comme: aa, ab, ab, ac, ac

8
Ken Mollerup