AWK para dividir a linha um e 2

Sep 09 2020

Depois de algum grep e awk, tenho a seguinte saída.

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

835231
2893

Eu simplesmente quero dividir 835231/2893.

No entanto, esses números mudarão toda vez que o comando for executado, então eu só preciso dizer ao awk como dividir as linhas 1 e 2 ou de alguma forma armazená-las em uma variável.

A maioria dos tutoriais online mostra apenas a divisão pela coluna. (awk '{print $ 1 / $ 2) mas isso não funcionará neste caso.

Obrigada por apareceres!

Respostas

1 Cyrus Sep 09 2020 at 02:31

Anexe ao seu comando:

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

Atualize para evitar a divisão por erro zero:

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

Resultado:

288,708
2 EdMorton Sep 09 2020 at 03:35

Substitua | grep s | awk '{print $2}'por:

| 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

Armazenar valores na matriz; Dividir no Bloco Final

Se você sabe que sempre haverá exatamente dois valores, ou se você se preocupa apenas com as duas primeiras correspondências, pode armazenar os valores em uma matriz associativa e realizar sua divisão no final. Por exemplo:

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

Isso rende 288.708.

Se você estiver consultando o banco de dados de qualquer maneira, talvez seja melhor construir uma consulta SQL que peça ao banco de dados para realizar a divisão para você. Nunca mexa nos resultados da consulta diretamente quando você pode fazer com que o banco de dados faça o trabalho para você.