Usando o bash, como posso descobrir a média, o máximo e o mínimo de uma lista de números?

18

Eu tenho uma série de greps, awks e seds que produzem uma lista de números, um em cada linha. Algo assim:

1.13
3.59 
1.23

Como posso canalizar isso para algo que produzirá a média, max e min?

JavaRocky
fonte
Se você estiver executando grep, awk e sed juntos, geralmente o mesmo pode ser feito em uma chamada do awk.
Pausado até novo aviso.

Respostas:

27

Como você já está usando o awk

blahblahblah | awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1}; total+=$1; count+=1} END {print total/count, max, min}'
DerfK
fonte
Bom, funciona para mim!
JavaRocky
Eu pensei que já existia um binário que aceita uma lista de números e a contagem, média, min, máxima para você, como usar 'time'.
JavaRocky 23/02
11
Gostaria apenas de colocar o awkpadrão acima /usr/local/bin/statsou algo assim e usá-lo como blabla | stats.
Acumenus 29/08
0

Há também simple-r, que pode fazer quase tudo o que R, mas com menos pressionamentos de tecla:

https://code.google.com/p/simple-r/

Para calcular a média, max e min, seria necessário digitar um dos seguintes:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -
user192124
fonte
0

Com uma ponta do chapéu para @DerfK:

perl -lane '$n=$F[0]; if(not defined $min){$min=$max=$n}; if($n>$max){$max=$n}; if($n<$min){$min=$n}; $total+=$n; $count+=1; END{print $total/$count." $max $min"}'

$F[0] é o valor no primeiro (0'ésimo) campo de cada linha

Se seus dados de entrada estiverem separados por vírgula, adicione o -F,modificador antes de-lane

Chris Koknat
fonte