Pourquoi l'enregistrement non numérique apparaît après «0» dans le tri?

8

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.fmontré juste après 0.fet avant 1.f? Est-ce parce que 0n'est pas traité comme un nombre par sort? J'ai cherché sur le Web et je n'ai trouvé aucune référence.

nn0p
la source
Toujours le même après l'ajout LC_ALL=C.
nn0p

Réponses:

12

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:

-n
Restreint la clé de tri à une chaîne numérique initiale, composée de caractères vides facultatifs, d'un signe moins facultatif et de zéro ou plusieurs chiffres avec un caractère radix facultatif et des milliers de séparateurs (tels que définis dans les paramètres régionaux actuels), triés par valeur arithmétique . Une chaîne de chiffres vide est traitée comme zéro. Les zéros en tête et les signes sur les zéros n'affectent pas la commande.

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, -gvient 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.

bahamat
la source
Pour être complet, vous devez également mentionner comment sorttraite deux lignes ayant la même clé.
kasperd
1

vous pouvez utiliser -g

-g, --general-numeric-sort comparer en fonction de la valeur numérique générale

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#
rɑːdʒɑ
la source