58 votes

Comment trier UNIX par une seule colonne seulement?

Je sais que l'option -k pour la commande Unix sort nous permet de trier par une colonne spécifique et toutes les suivantes. Par exemple, en utilisant le fichier d'entrée suivant :

2 3
2 2
1 2
2 1
1 1

En utilisant sort -n -k 1, j'obtiens une sortie triée par la première colonne puis par la deuxième :

1 1
1 2
2 1
2 2
2 3

Cependant, je veux garder l'ordre de la deuxième colonne, comme ceci :

1 2
1 1
2 3
2 2
2 1

Est-ce possible avec la commande sort ?

87voto

Cascabel Points 1430

Essayez ceci :

sort -s -n -k 1,1

Le -s désactive le tri de 'dernier recours', qui trie sur tout ce qui n'était pas partie d'une clé spécifiée.

Le -k 1 ne signifie pas vraiment "ce champ et tous les suivants" dans le contexte du tri numérique, comme vous pouvez le voir si vous essayez de trier sur la deuxième colonne. Vous voyez simplement les égalités cassées en passant au reste de la ligne. En général, cependant, vous devez spécifier -k 1,1 pour trier seulement sur le champ un.

0 votes

Tu as raison. C'est exactement ce dont j'avais besoin. Merci!

0 votes

Est-il possible d'utiliser join sur la sortie de ce tri?

0 votes

@MiNdFrEaK: L'exigence de join est que l'entrée soit triée sur les champs sur lesquels vous effectuez la jointure. Donc oui, cette sortie est triée sur le premier champ et vous pouvez y effectuer la jointure.

10voto

Kalle Richter Points 740

Pour trier uniquement sur la première colonne, vous devriez faire :

sort -n -s -k1,1

De Manuel de l'administration système Unix et Linux

sort accepte la spécification de clé -k3 (plutôt que -k3,3), mais cela ne fait probablement pas ce que vous attendez. Sans le numéro de champ de terminaison, la clé de tri se poursuit jusqu'à la fin de la ligne

0 votes

Ne fonctionne pas pour moi, j'ai besoin d'ajouter l'option -s comme l'a souligné Cascabel.

0 votes

@JeanPaul tu as raison, la documentation pour -s dit "Cette option maintient l'ordre d'origine des enregistrements qui ont une clé égale".

2voto

user680341 Points 21

Aucune des réponses fournies ne fonctionne généralement pour moi.

À la fois sort -s -k 2 file1 et sort -n -k1,1 effectuent un tri supplémentaire avec ce fichier :

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

J'ai dû faire exactement cela et j'ai fini par utiliser une boucle shell. Cette solution pourrait ne pas fonctionner correctement sur un fichier très volumineux car le fichier entier doit être lu pour chaque valeur unique dans la colonne triée.

Ici le fichier est trié uniquement sur la colonne 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

0 votes

trier -s -k2,2 fichier1

0 votes

La réponse proposée par Cascabel fonctionne mais je pense que vous l'avez mal interprétée.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X