trouver la valeur maximale de la colonne 1 et imprimer l'enregistrement respectif de la colonne 2 du fichier


19

Comment trouver la valeur maximale dans la colonne 1 et faire écho à l'emplacement du chemin respectif à partir d'un fichier qui contient n nombre d'enregistrements.

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

Production attendue:

/opt/oracle/app/oracle/product/12.1.0

Réponses:


23

Cela devrait fonctionner:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

Le -v max=0définit la variable maxsur 0, puis, pour chaque ligne, le premier champ est comparé à la valeur actuelle de max. S'il est supérieur, il maxest défini sur la valeur du 1er champ et wantsur la ligne actuelle. Lorsque le programme a traité l'intégralité du fichier, la valeur actuelle de wantest imprimée.

Éditer

Je n'ai pas testé la awksolution plus tôt et c'était vraiment mon mal de l'avoir fournie. Quoi qu'il en soit, la version éditée de la réponse devrait fonctionner (merci à terdon de l'avoir corrigée) et j'ai également testé ce qui suit.

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

Je suis sortsur le premier champ où,

  • -n spécifie le tri numérique.
  • -r spécifie inverser le résultat du tri.
  • -k1,1 spécifie le premier champ pour le tri.

Maintenant, après le tri, je passe la sortie et j'obtiens juste le premier résultat qui me donnera la valeur numériquement la plus élevée de column1 dans le résultat.

Maintenant, je l'ai finalement dirigé vers cutle délimiteur spécifié en tant qu'espace et en imprimant celui -f3qui est la sortie prévue.

Essai

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

Maintenant, après avoir exécuté la commande ci-dessus pour l'entrée comme ci-dessus, j'obtiens la sortie comme,

/Max/number

awk max ne compare pas numériquement le champ de chaîne. est-ce pour cela que vous avez donné une deuxième approche?
Sajuuk

7

Vous pouvez le faire avec AWK.

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

Ici, la première colonne de chaque ligne est comparée à la variable max(qui est initialement 0). Si la première colonne a une valeur supérieure à celle maxalors la deuxième colonne est stockée dans la variable line, cela continue pour chaque ligne du fichier.

À la fin du fichier, une ENDrègle est exécutée pour imprimer la linevariable.


4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log

3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
Cela devrait fonctionner mais est inefficace, car le tri est excessif lorsque la tâche consiste à trouver un maximum.
jw013

2

Vous pouvez simplement le trier en utilisant la sortcommande

sort -r version.log | head -n1 | awk '{print $2}'

Production:

/opt/oracle/app/oracle/product/12.1.0

vous souhaitez imprimer la deuxième valeur uniquement essayez ce chat version.log | sort -r | tête -n1 | awk -F "" '{Print $ 2}'
Security Beast

Veuillez ne pas publier de captures d'écran de votre terminal. Collez simplement le texte à la place. De plus, il n'est pas nécessaire de cattrier les fichiers d'entrée directement.
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
Cela ressemble à un nouveau hachage de la réponse acceptée? Veuillez expliquer en quoi elles diffèrent.
Stephen Rauch

En effet, à tout le moins, donnez du crédit à l'auteur d'origine.
Jeff Schaller
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.