Je souhaite trier les fichiers en fonction du numéro dans le nom de fichier. Voici les fichiers:
$ ls *.f
0.f 13.f 1.f 22.f 4.f abc.f
Le résultat du tri:
$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f
Ce à quoi je m'attendais, c'était:
$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f
Pourquoi a été abc.f
montré juste après 0.f
et avant 1.f
? Est-ce parce que 0
n'est pas traité comme un nombre par sort
? J'ai cherché sur le Web et je n'ai trouvé aucune référence.
LC_ALL=C
.Réponses:
La raison en est que lorsque vous utilisez le tri numérique, les chaînes sans nombre sont traitées comme zéro. Le tri GNU obtient le bon comportement, mais ne fait aucun commentaire sur la raison. La page de manuel sur illumos pour le tri SunOS fournit une explication:
Ce comportement est également spécifié dans SUSv4 et POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ), en utilisant le même verbiage que la page de manuel illumos.
Le tri GNU a également un
-g
"tri numérique général", qui trie par nombres à virgule flottante au lieu d'entiers où les chaînes de chiffres vides sont triées avant zéro. Je ne sais pas si c'est un effet secondaire ou intentionnel. Cependant,-g
vient avec un avertissement car il est beaucoup plus lent que-n
. Si vous triez un grand ensemble de données ou faites quelque chose que les utilisateurs attendent, vous devez éviter-g
.la source
sort
traite deux lignes ayant la même clé.vous pouvez utiliser -g
la source