1
votes

AWK pour diviser les lignes un et 2

Après quelques grep et awk, j'ai la sortie suivante.

 [root@nalba ~]# mysql -e "show global status like '%innodb_buffer_pool_read%';" | grep s | awk '{print $2}'

835231
2893

Je veux simplement diviser 835231/2893.

Cependant, ces nombres changeront à chaque fois que la commande est run donc j'ai juste besoin de dire à awk comment diviser les lignes 1 et 2 ou les stocker d'une manière ou d'une autre dans une variable.

La plupart des tutoriels en ligne ne montrent que la division par la colonne. (awk '{print $ 1 / $ 2) mais cela ne fonctionnera pas dans ce cas.

Merci d'être passé!


1 commentaires

Essayez de faire un piping avec tr -d '\ n' avant awk .


3 Réponses :


1
votes

Stocker les valeurs dans le tableau; Division dans le bloc de fin

Si vous savez qu'il y aura toujours exactement deux valeurs, ou que vous ne vous souciez que des deux premières correspondances, vous pouvez stocker les valeurs dans un tableau associatif et effectuer votre division à la fin. Par exemple:

test_data="foo 835231\nbar 2893"
echo -e "$test_data" |
    awk '{ values[NR] = $2 }; END { print values[1] / values[2] }'

Cela donne 288.708.

Si vous interrogez la base de données de toute façon, vous feriez peut-être mieux construire une requête SQL qui demande à la base de données d'effectuer la division à votre place. Ne modifiez jamais directement les résultats des requêtes lorsque vous pouvez demander à la base de données de faire le travail à votre place.


2 commentaires

Je suis vraiment désolé, je n'ai pas pu comprendre votre réponse. Permettez-moi d'essayer de reformuler la question. Après cette commande, j'obtiens deux nombres, j'ai juste besoin de trouver un moyen de diviser les deux nombres car ces nombres changeront toujours. [root @ nalba ~] # mysql -e "affiche l'état global comme '% innodb_buffer_pool_read%';" | grep s | awk '{print $ 2}' nombrea nombreb


Vous pouvez modifier la commande de Todd pour l'utiliser directement après votre commande mysql: mysql ... | awk '/ s / {valeurs [++ c] = $ 2}; END {imprimer les valeurs [1] / valeurs [2]} '



1
votes

Ajoutez à votre commande:

288.708

Mise à jour pour éviter la division par zéro erreur:

| awk '{a=$1; getline; b=$1; if(b==0){print "error"} else {print a/b}}'

Sortie:

| awk '{a=$1; getline; b=$1; print a/b}'


2 commentaires

C'est exactement ce dont j'avais besoin, donc je l'ai marqué comme la bonne réponse, merci beaucoup pour votre temps, il semble que la clé ici est la "getline". Je vais enquêter plus à ce sujet. Merci beaucoup!


Voir Commentaire d'Ed pour plus d'informations sur getline .



2
votes

Remplacez | grep s | awk '{print $ 2}' avec:

| awk '/s/{v[++c]=$2} c==2{print (v[2] ? v[1] / v[2] : "NaN"); exit}'


0 commentaires