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 exécutée, il me suffit donc de dire à awk comment diviser les lignes 1 et 2 ou les stocker dans une variable.
La plupart des didacticiels en ligne ne vous montrent que la division par colonne. (awk '{print $ 1 / $ 2) mais cela ne fonctionnera pas dans ce cas.
Merci d'être passé!
Réponses
Ajoutez à votre commande:
| awk '{a=$1; getline; b=$1; print a/b}'
Mettre à jour pour éviter la division par zéro erreur:
| awk '{a=$1; getline; b=$1; if(b==0){print "error"} else {print a/b}}'
Production:
288,708
Remplacez | grep s | awk '{print $2}'par:
| awk '/s/{v[++c]=$2} c==2{print (v[2] ? v[1] / v[2] : "NaN"); exit}'
Stocker les valeurs dans le tableau; Diviser en bloc d'extrémité
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 cède 288.708.
Si vous interrogez malgré tout la base de données, vous feriez peut-être mieux de créer une requête SQL qui demande à la base de données d'effectuer la division pour vous. Ne bricolez jamais directement les résultats des requêtes lorsque vous pouvez demander à la base de données de faire le travail à votre place.