Pourquoi trier change-t-il l'ordre des lignes avec des clés de tri identiques?

31

Voici les données:

D 2
B 2
A 2

Lorsque j'exécute cette commande:

sort -k2,2 file

il génère:

A 2
B 2
D 2

Ma question est que lorsque je ne spécifie que la deuxième colonne -k2,2, pourquoi est-il également trié par la première colonne? Étant donné que toutes les valeurs de la deuxième colonne sont identiques, elle doit la laisser telle quelle.

dwwdw
la source
7
[Semi-OT]: FYI, un tri qui préserve l'ordre d'entrée lorsque les clés de tri correspondent est connu en informatique comme tri stable . Souvent, les tris ne sont pas stables, car de nombreux algorithmes de tri non stables sont plus rapides ou plus simples. Ce n'est pas le cas ici, mais connaître le terme CS rend les documents de page de manuel pour l' -soption compréhensibles et trouvables.
derobert

Réponses:

34

C'est la dernière comparaison . Lors de la comparaison de deux lignes, si toutes les clés se comparent égales, alors en dernier recours, une comparaison de chaîne de base de toutes les lignes est effectuée ( -rs'applique toujours mais pas les autres options). Ce comportement est spécifié par POSIX :

Sauf lorsque l'option -u est spécifiée, les lignes qui comparent autrement égal doivent être ordonnées comme si aucune des options -d, -f, -i, -n ou -k n'était présente (mais avec -r toujours en vigueur, si il a été spécifié) et avec tous les octets dans les lignes significatives pour la comparaison. L'ordre dans lequel les lignes qui se comparent toujours égales sont écrites n'est pas spécifié.

Avec GNU sort, cette comparaison de dernier recours peut être désactivée avec l' option -s(pour stable ).

Stéphane Chazelas
la source