AWK per dividere la linea uno e 2
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
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
Sostituisci | grep s | awk '{print $2}'con:
| awk '/s/{v[++c]=$2} c==2{print (v[2] ? v[1] / v[2] : "NaN"); exit}'
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.