Usando bash, ¿cómo puedo encontrar el promedio, máximo y mínimo de una lista de números?


18

Tengo una serie de greps, awks y seds que producen una lista de números, uno en cada línea. Algo como esto:

1.13
3.59 
1.23

¿Cómo puedo canalizar esto a algo que produzca el promedio, máximo y mínimo?


Si está conectando grep, awk y sed juntos, a menudo se puede hacer lo mismo en una invocación de awk.
Pausado hasta nuevo aviso.

Respuestas:


27

Como ya estás usando 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}'

¡Bien, funciona para mí!
JavaRocky

Pensé que ya habría habido un binario que acepta una lista de números y el recuento, promedio, mínimo, máximo para usted, algo así como usar 'tiempo'.
JavaRocky

1
Simplemente pondría el awkpatrón anterior en /usr/local/bin/statso tal, y luego lo usaría como blabla | stats.
Acumenus


0

También hay simple-r, que puede hacer casi todo lo que R puede, pero con menos pulsaciones de teclas:

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

Para calcular el promedio, máximo y mínimo, uno tendría que escribir uno de:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -

0

Con una punta del sombrero 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] es el valor en el primer (0'th) campo de cada línea

Si sus datos de entrada están separados por comas, agregue el -F,modificador antes-lane

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.