J'ai un fichier à deux colonnes; le fichier est déjà trié comme je le souhaite dans la colonne 1. Je voudrais trier sur la colonne 2, dans chaque catégorie de la colonne 1. Cependant, sort
ne comprend pas l'ordre de tri de la colonne 1.
La manière normale (à partir de questions similaires ici sur la pile) serait la suivante:
sort --stable -k1,1 -k2,2n
Mais je ne peux pas spécifier le tri sur k1, car il est arbitraire.
Exemple d'entrée:
C 2
C 1
A 2
A 1
B 2
B 1
et sortie:
C 1
C 2
A 1
A 2
B 1
B 2
seq 30 | xargs -L1 bash -cs 'yes $1 | head -1000000 | paste - <(seq 1000000) | shuf' bash
Vous pouvez utiliser une transformation schwartzienne (il s'agit essentiellement de l'approche décorer-trier-décorer que vous avez mentionnée dans un commentaire, mais probablement plus performante que la bonne réponse de muru en raison de l'utilisation d'une seule
sort
invocation par opposition à plusieurs) - en utilisantawk
ajouter une colonne de préfixe qui incréments avec un changement de valeur dans la première colonne, trier par la colonne préfixe suivie de la "deuxième" colonne (dont la position ordinale a temporairement changé en3
raison de la présence de la colonne préfixe), et enfin se débarrasser de la colonne préfixela source
awk -v OFS="\t" '$1 != prev { key++ } { print key, $0; prev = $1 }
(non testé).