Comment UNIX trier par une seule colonne?

47

Je sais que l'option -k pour le tri Unix nous permet de trier une colonne spécifique et toutes les suivantes . Par exemple, étant donné le fichier d'entrée:

2 3
2 2
1 2
2 1
1 1

En utilisant sort -n -k 1, je reçois une sortie triée par la 1ère colonne puis par la 2ème:

1 1
1 2
2 1
2 2
2 3

Cependant, je veux garder l'ordre de la 2e colonne, comme ceci:

1 2
1 1
2 3
2 2
2 1

Est-ce possible avec la sortcommande?

ssn
la source

Réponses:

65

Essayez ceci:

sort -s -n -k 1,1

Les -sdésactive de dernier recours 'tri qui trie sur tout ce qui ne faisait pas partie d'une clé spécifiée.

En -k 1réalité, cela ne signifie pas "ce champ et tous les suivants" dans le contexte du tri numérique, comme vous pouvez le voir si vous essayez de trier la deuxième colonne. Vous ne voyez que des liens brisés en allant au reste de la ligne. En général, cependant, vous devez spécifier -k 1,1de ne trier que sur le premier champ.

Cascabel
la source
Vous avez raison. C'est exactement ce dont j'avais besoin. Merci!
est-il possible d'utiliser join sur la sortie de ce type?
MiNdFrEaK
@MiNdFrEaK: La condition requise joinest que l'entrée soit triée sur les champs sur lesquels vous vous joignez . Donc, bien sûr, cette sortie est triée sur le premier champ et vous pouvez la rejoindre.
Cascabel
J'ai 2 fichiers, l'un avec 2 colonnes, l'autre avec 1 colonne. Le second fichier est trié en utilisant sort -u. Maintenant, la tâche est j'ai besoin de joindre cette colonne avec la première colonne du premier fichier, qui n'est pas triée, alors quelle sera la syntaxe? Est-ce que ça va marcher? rejoindre -j 1 fichier2.txt tri -s -n -k 1 fichier1.txt?
MiNdFrEaK
1
La -k 1,1(la " , 1 " partie) ne fonctionne pas mieux pour moi. Ce qui fonctionne est -s -k 1, avec -nsi vous en avez besoin.
Totor
10

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

sort -n -s -k1,1

De Unix et Linux système Manuel d' administration

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

tidbeck
la source
Ne fonctionnant pas pour moi, je dois ajouter l' -soption, comme l'a souligné Cascabel.
Jean Paul
@JeanPaul vous avez raison, la documentation pour -sindique "Cette option conserve l'ordre des enregistrements d'origine des enregistrements qui ont une clé égale."
Tidbeck le
2

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

Les deux sort -s -k 2 file1et sort -n -k1,1faire un tri supplémentaire avec ce fichier:

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

Je devais juste faire cette chose exacte et fini par utiliser une boucle shell. Cette solution risque de ne pas fonctionner correctement sur un fichier très volumineux, car le fichier entier doit être lu pour chaque valeur unique de la colonne triée.

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

# 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
utilisateur680341
la source
sort -s -k2,2 file1
Plhn
La réponse proposée par Cascabel fonctionne mais je pense que vous l’avez mal comprise.
Jean Paul