Comportement incorrect de la commande de tri?

14

J'ai essayé de trier le contenu d'un fichier dans le bureau Ubuntu 14.04 (Trusty Tahr). Dans mon cas, le résultat attendu devrait être le même que le 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
user2909884
la source
4
Je vous remets un petit trophée pour votre utilisation inutilecat .
David Foerster
3
Le commentaire de @DavidFoerster est une façon amusante de souligner que vous pouvez remplacer cat test.txt | sortpar sort test.txt:)
Volker Siegel
@VolkerSiegel: Vrai, bien qu'il existe des formulations utiles catpour commencer. Par exemple cat FILE | grep dev | sort, seules les lignes contenant "dev" seront affichées (dans l'ordre trié). L'utilisation sort FILE | grep devproduit la même sortie mais colorée.
AlainD

Réponses:

17

Vous pouvez utiliser une LC_ALLvariable, définissez-la sur LC_ALL=Cavant d'appelersort

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

Lisez cette réponse, si vous voulez savoir ce que c'est par magie LC_ALL=C. Voici un bref résumé:

La locale C est une locale spéciale qui est censée être la locale la plus simple. Vous pouvez également dire que si les autres paramètres régionaux sont réservés aux humains, les paramètres régionaux C concernent les ordinateurs. Dans l'environnement local C, les caractères sont des octets uniques, le jeu de caractères est ASCII, l'ordre de tri est basé sur les valeurs d'octets.

En outre, comme l'a souligné @KenMollerup, citez 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 par octet. Sinon sort, ignorera tous les caractères non alphanumériques.

c0rp
la source
Désolé de ne pas avoir vu ça, j'ai réagi au commentaire!
Ken Mollerup
@KenMollerup merci d'avoir indiqué man sort. Je ne l'ai pas remarqué
c0rp
8

Le tri utilise le tri alphabétique et numérique, comme nous, les caractères spéciaux comme + - <> ... sont ignorés, les nombres sont traités numériquement donc 1, 2, 3 .. précède le 11, 12 1066 1104 - voyez!

Donc, votre liste est considérée comme: aa, ab, ab, ac, ac

Ken Mollerup
la source
Existe-t-il une option de tri, telle qu'elle n'ignore pas les caractères spéciaux tels que test.txt trie de la manière souhaitée?
Doug Smythies
6
Voir ceci dans man sort: *** AVERTISSEMENT *** Le paramètre régional spécifié par l'environnement affecte l'ordre de tri. Définissez LC_ALL = C pour obtenir l'ordre de tri traditionnel qui utilise des valeurs d'octets natives.
Ken Mollerup
@KenMollerup, veuillez ajouter plus d'informations à votre réponse. Ajoutez une citation de man sort, ajoutez des exemples.
c0rp
Oui mais j'étais trop lent, voir la réponse de c0rp ci-dessous.
Ken Mollerup