Tri des données en fonction de la deuxième colonne d'un fichier

213

J'ai un fichier de deux colonnes et un nnombre de lignes.

la colonne 1 contient nameset la colonne2 age.

Je souhaite trier le contenu de ce fichier par ordre croissant en fonction de age(dans la deuxième colonne).

Le résultat doit afficher le nameplus jeune ainsi que le namedeuxième plus jeune, etc.

Toutes les suggestions pour un shell ou un script bash.

Angelo
la source
1
Surensemble: délimiteur personnalisé: stackoverflow.com/questions/1037365/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

330

Vous pouvez utiliser la sortcommande :

sort -k2 -n yourfile

-n, --numeric-sortcomparer selon la valeur numérique de la chaîne

Par exemple:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54
Matt Ryall
la source
1
notez également que l'utilisation -hau lieu de -ntriera les valeurs lisibles par l'homme comme 2Gou 3Kainsi que les nombres séparés par des virgules, par exemple1,234.5
chillitom
Problème rencontré avec une "mauvaise" commande. Faites attention à l'homme "*** AVERTISSEMENT *** Les paramètres régionaux spécifiés par l'environnement affectent l'ordre de tri. Définissez LC_ALL=Cpour obtenir l'ordre de tri traditionnel qui utilise des valeurs d'octets natives." (pour le cas de correspondance de chaîne sans -n)
x'ES
Cela ne prend pas en compte les espaces dans la première colonne et ne fonctionne pas s'il y a plus de colonnes après la seconde, car -k est lu jusqu'à la fin de la ligne. En supposant qu'il s'agit d'un fichier TSV, une meilleure solution estsort -t$'\t' -k2 -n FILE
tuxErrante
vous devrez peut-être spécifier votre délimiteur à l'aide de l'option -t
spectre
85

Solution:

sort -k 2 -n filename

écrit plus verbalement comme:

sort --key 2 --numeric-sort filename


Exemple:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Explication:

  • -k # - cet argument spécifie la première colonne qui sera utilisée pour trier. (notez que la colonne ici est définie comme un champ délimité par des espaces; l'argument -k5sera trié en commençant par le cinquième champ de chaque ligne, pas le cinquième caractère de chaque ligne)

  • -n - cette option spécifie un "tri numérique" signifiant que la colonne doit être interprétée comme une ligne de nombres, au lieu de texte.


Plus:

Les autres options courantes incluent:

  • -r - cette option inverse l'ordre de tri. Il peut également s'écrire --reverse .
  • -i - Cette option ignore les caractères non imprimables. Il peut également s'écrire --ignore-nonprinting .
  • -b - Cette option ignore les principaux espaces vides, ce qui est pratique car les espaces blancs sont utilisés pour déterminer le nombre de lignes. Il peut également être écrit sous la forme --ignore-leader-blanks .
  • -f - Cette option ignore la casse des lettres. "A" == "a". Il peut également s'écrire --ignore-case .
  • -t [nouveau séparateur] - Cette option fait que le prétraitement utilise un opérateur autre que l'espace. Il peut également s'écrire --field-separator .

Il existe d'autres options, mais ce sont les plus courantes et les plus utiles que j'utilise souvent.

DCurro
la source
@ Angelo Cette réponse a probablement été publiée des années après avoir accepté une réponse à cette question, mais l'avez-vous considérée comme la nouvelle réponse acceptée?
Jonathan Y.
L'option -tétait une véritable économie de vie !! lorsque vos colonnes ont des espaces et des colonnes diffèrent par un caractère donné comme ,ou un onglet
AKS
12

Pour les valeurs séparées par des tabulations, le code ci-dessous peut être utilisé

sort -t$'\t' -k2 -n

-r peut être utilisé pour obtenir des données dans l'ordre décroissant.
-n pour le tri numérique
-k, --key = POS1 [, POS2] où k est la colonne du fichier
Pour l'ordre décroissant ci-dessous est le code

sort -t$'\t' -k2 -rn
Saurabh
la source
4

Utilisez sort.

sort ... -k 2,2 ...
Ignacio Vazquez-Abrams
la source
8
Vous devez également utiliser -n pour trier en fonction des âges (tri numérique). Sinon, «11» viendra avant «2».
Matt Ryall