Vous pouvez utiliser plusieurs -kindicateurs pour trier sur plus d'une colonne. Par exemple, pour trier par nom de famille puis par prénom en tant que bris d'égalité:
sort -k 2,2-k 1,1 file.txt
Options pertinentes de "man sort":
-k, --key = POS1 [, POS2]
démarrer une clé à POS1, la terminer à POS2 (origine 1)
POS est F [.C] [OPTS], où F est le numéro de champ et C la position du caractère dans le champ. OPTS est une ou plusieurs options de tri à une lettre, qui remplacent les options de tri globales pour cette clé. Si aucune clé n'est donnée, utilisez la ligne entière comme clé.
-t, --field-separator = SEP
utiliser SEP au lieu de la transition non vide à vide
Soyez juste un peu prudent à utiliser --field-separator=','si vous pouvez avoir un opérateur de saisie de données pour saisir des valeurs pour "Prénom" comme "Billy Bob" ou autre ... les espaces peuvent facilement entrer dans vos données si vous ne vous en protégez pas, mais les virgules sont relativement peu probables.
Tony Delroy
1
Il y a très probablement des cas de virgules dans ces champs, comme "Smith, Jr." ou "McDowell, Sr." ou "Dr. John" ou "New York, NY"
jbnunn
2
Notez que si les colonnes sont visuellement alignées, c'est-à-dire qu'il y a un nombre non constant d'espaces entre chaque champ, vous devez utiliser l' -boption. En effet, sorton considère en fait que la chaîne à trier commence juste après la virgule et non à partir de la première lettre de la colonne. De plus, vous devrez peut-être préfixer la commande avec LC_ALL=C, pour éviter tout effet secondaire dû aux paramètres régionaux, qui peut se produire même sur un simple fichier ASCII.
calandoa
@calandoa Merci pour la partie sur -b( --ignore-leading-blanks). Pour clarifier un peu: echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2donne la a<SPACE><SPACE>bpremière (la deuxième colonne commence après la première non-blank to blank transition, et <SPACE><SPACE>best avant <SPACE>a), mais avec -belle donne aa<SPACE>acomme prévu ( aest avant b).
Kirill Bulygin
7
Pour trier uniquement par deuxième champ (donc là où les deuxièmes champs correspondent, les lignes avec des correspondances restent dans l'ordre dans lequel elles sont dans l'original sans trier sur les autres champs):
Réponses:
S'il s'agit d'UNIX:
Vous pouvez utiliser plusieurs
-k
indicateurs pour trier sur plus d'une colonne. Par exemple, pour trier par nom de famille puis par prénom en tant que bris d'égalité:Options pertinentes de "man sort":
la source
--field-separator=','
si vous pouvez avoir un opérateur de saisie de données pour saisir des valeurs pour "Prénom" comme "Billy Bob" ou autre ... les espaces peuvent facilement entrer dans vos données si vous ne vous en protégez pas, mais les virgules sont relativement peu probables.-b
option. En effet,sort
on considère en fait que la chaîne à trier commence juste après la virgule et non à partir de la première lettre de la colonne. De plus, vous devrez peut-être préfixer la commande avecLC_ALL=C
, pour éviter tout effet secondaire dû aux paramètres régionaux, qui peut se produire même sur un simple fichier ASCII.-b
(--ignore-leading-blanks
). Pour clarifier un peu:echo -e 'aa<SPACE>a\na<SPACE><SPACE>b' | sort -k2
donne laa<SPACE><SPACE>b
première (la deuxième colonne commence après la premièrenon-blank to blank transition
, et<SPACE><SPACE>b
est avant<SPACE>a
), mais avec-b
elle donneaa<SPACE>a
comme prévu (a
est avantb
).Pour trier uniquement par deuxième champ (donc là où les deuxièmes champs correspondent, les lignes avec des correspondances restent dans l'ordre dans lequel elles sont dans l'original sans trier sur les autres champs):
la source
FWIW, voici une méthode de tri pour montrer quels processus utilisent le plus de mémoire virtuelle.
Les options de tri sont définies sur la première colonne, en utilisant: comme séparateur de colonne, le tri numérique et le tri inversé.
la source
En conséquence, vous pouvez modifier le numéro de colonne.
la source