web-dev-qa-db-fra.com

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

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
24
ABUL KASHIM

Cela devrait fonctionner:

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

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

Modifier

Je n'ai pas testé la solution awk plus tôt et c'était vraiment ma faute 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 sorting sur 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 cut avec le délimiteur spécifié comme espace et en imprimant le -f3 qui est la sortie prévue.

Test

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
26
Ramesh

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 à max alors la deuxième colonne est stockée dans la variable line, cela continue pour chaque ligne du fichier.

À la fin du fichier, la règle END est exécutée pour imprimer la variable line.

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

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

3
Mandar Shinde

Vous pouvez simplement le trier à l'aide de la commande sort

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

Production:

/opt/Oracle/app/Oracle/product/12.1.0
2
Security Beast