web-dev-qa-db-fra.com

Pourquoi les sorties de `sort`,` sort k 1`, `sort k 1,1` sont-elles égales?

J'ai un fichier:

$ cat file
1 c
8 a
1 b
5 f

Je pense que la commande sort au début compare le premier champ de toutes les lignes et les trie, puis ces lignes ont des premiers champs égaux et recommence le tri pour les seconds champs comme ceci:

$sort file
1 b
1 c
5 f
8 a

J'ai lu sur la différence entre les options k 1 et k 1,1: avec k 1, il est possible que la clé de tri continue jusqu'à la fin de la ligne, mais avec k 1,1, elle ne devrait trier que le premier champ sans considérer les autres champs mais:

$sort -k 1 file
1 b
1 c
5 f
8 a

$sort -k 1,1 file
1 b
1 c
5 f
8 a

Pourquoi les sorties de sort = sort k 1 = sort k 1,1 sont-elles égales?

Je pense que la sortie de sort k 1,1 file devrait être

1 c 
1 b
5 f
8 a

Si ce n'est pas correct, dites-moi quelle est mon erreur et comment puis-je obtenir une sortie comme ça?

2
Sinoosh

De info sort

   Many options affect how ‘sort’ compares lines; if the results are
unexpected, try the ‘--debug’ option to see what happened.  A pair of
lines is compared as follows: ‘sort’ compares each pair of fields, in
the order specified on the command line, according to the associated
ordering options, until a difference is found or no fields are left.  If
no key fields are specified, ‘sort’ uses a default key of the entire
line.  Finally, as a last resort when all keys compare equal, ‘sort’
compares entire lines as if no ordering options other than ‘--reverse’
(‘-r’) were specified.  The ‘--stable’ (‘-s’) option disables this
“last-resort comparison” so that lines in which all fields compare equal
are left in their original relative order.  The ‘--unique’ (‘-u’) option
also disables the last-resort comparison.

Donc, pour obtenir le résultat souhaité (sachant que votre premier champ est numérique)

$ sort -s -k1,1n file
1 c
1 b
5 f
8 a
7
steeldriver

Si vous voulez que la deuxième colonne soit inversée (ce n'est pas une réponse appropriée à votre question, mais peut-être est-ce ce qui vous intéresse-t-il), en élaborant un peu à partir de nix StackExchange on obtient:

sort -k1,1n -k2,2r file
3
dadexix86