AWK per dividere la linea uno e 2

Sep 09 2020

Dopo alcuni grep e awk ho il seguente output.

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

835231
2893

Voglio semplicemente dividere 835231/2893.

Tuttavia questi numeri cambieranno ogni volta che il comando viene eseguito, quindi devo solo dire a awk come dividere le righe 1 e 2 o in qualche modo memorizzarle in una variabile.

La maggior parte dei tutorial online mostra solo la divisione per il colunm. (awk '{print $ 1 / $ 2) ma in questo caso non funzionerà.

Grazie per esserti fermato!

Risposte

1 Cyrus Sep 09 2020 at 02:31

Aggiungi al tuo comando:

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

Aggiorna per evitare la divisione per errore zero:

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

Produzione:

288.708
2 EdMorton Sep 09 2020 at 03:35

Sostituisci | grep s | awk '{print $2}'con:

| 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

Store Values ​​in Array; Dividi in End Block

Se sai che ci saranno sempre esattamente due valori, o ti interessano solo le prime due corrispondenze, puoi memorizzare i valori in un array associativo ed eseguire la divisione alla fine. Per esempio:

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

Questo produce 288.708.

Se stai comunque interrogando il database, potresti fare meglio a costruire una query SQL che chiede al database di eseguire la divisione per te. Non armeggiare mai direttamente con i risultati delle query quando puoi fare in modo che il database faccia il lavoro per te.