AWK pour diviser les lignes un et 2

Sep 09 2020

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

1 Cyrus Sep 09 2020 at 02:31

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
2 EdMorton Sep 09 2020 at 03:35

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

| awk '/s/{v[++c]=$2} c==2{print (v[2] ? v[1] / v[2] : "NaN"); exit}'
1 ToddA.Jacobs Sep 09 2020 at 02:22

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.