Média de vários números - Shell script

Média de vários números - Shell script

Eu criei um script que visualiza um arquivo de log e greps por uma quantidade específica de milissegundos/segundos. Criei algo que visualiza o valor mínimo e máximo, porém preciso encontrar a média da lista.

logdir_8080='/opt/product/apachetomcat/8.5.5_8080/logs'
cd "$logdir_8080"

get_file=`ls -rt localhost_access_log.*.txt|tail -1`

cat $get_file | tail -1000 | grep "objectId" | awk -F 'HTTP/1.1" 200' '{ 
print $2}'|awk -F' ' '{ print $2 }' | sort - n>/opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt

valor_mínimo:

cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|head -1

Valor máximo:

cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|tail -1

Ideia da lista:

233
249
283
283
302
303
332
333
643
851
965
965
972
1022
1135
1182
1213
1232
1264
1273
1390
1403
1414
1429
1474
1537
1540
1543
1545
1556
1565
1566
1577
1589
1591
1599
1602
1621
1622
1647
1653
1705
1740
1772
1774
1933
1935
1983
1990

Como obter a média?

Responder1

Se a única coisa no seu arquivo forem números, você poderá usar um único comando awk para obter tudo.

awk 'BEGIN {themin=10000000; themax=0; thecount=0; thesum=0}
    {for (i=1; i<=NF; i++) {
        thesum += $i;
        thecount++;
        if ($i < themin) {themin = $i}
        if ($i > themax) {themax = $i}
    }}
    END {
      printf("The min is %d\nThe max is %d\nThe sum is %d\nThe total number of items is %d\nThe average of those items is %d\n", themin, themax, thesum, thecount, int(thesum/thecount))
}' _file_

Eu o dividi para que você possa ver as diferentes seções.

O BEGIN está apenas inicializando todas as variáveis ​​a serem utilizadas. A variável themin pode ser definida com qualquer valor grande que você desejar, desde que seja maior do que qualquer coisa em seu arquivo.

A parte do meio apenas percorre cada linha e cada campo dessa linha. É somar os números e contar todos os números para que uma divisão simples possa ser feita no final. As duas instruções if coletam seus valores mínimo e máximo.

O END imprime todas as informações relevantes, incluindo seu mínimo, máximo e média.

Espero que isto ajude.

Responder2

Não há necessidade de escrever suas próprias soluções para problemas que já possuem soluções esplêndidas. Afinal, você perguntou no SuperUser e não no StackOverflow.

Por exemplo, use GNUdatamash

$ datamash min 1 max 1 mean 1 < yourFile
233     1990    1272.0408163265

ou use as ferramentas do pacotenum-utils

$ numbound -l yourFile
233
$ numbound yourFile
1990
$ numaverage yourFile
1272.04081632653

informação relacionada