Usando bash, come posso trovare la media, il massimo e il minimo da un elenco di numeri?


18

Ho una serie di greps, awks e seded che producono un elenco di numeri, uno su ogni riga. Qualcosa come questo:

1.13
3.59 
1.23

Come posso indirizzare questo a qualcosa che produrrà la media, il massimo e il minimo?


Se stai convogliando grep, awk e sed insieme, la stessa cosa può essere spesso fatta in un'unica invocazione di awk.
In pausa fino a nuovo avviso.

Risposte:


27

Dal momento che stai già utilizzando 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}'

Bello, funziona per me!
JavaRocky,

Pensavo che ci sarebbe già stato un binario che accetta un elenco di numeri e il conteggio, avg, min, max per te, un po 'come usare il' tempo '.
JavaRocky,

1
Vorrei solo inserire il awkmodello sopra /usr/local/bin/statso simile e quindi usarlo come blabla | stats.
Acumenus,


0

C'è anche simple-r, che può fare quasi tutto ciò che R può fare, ma con meno tasti:

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

Per calcolare la media, il massimo e il minimo, si dovrebbe digitare uno di:

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

0

Con una punta del cappello a @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] è il valore nel primo (0 °) campo di ogni riga

Se i tuoi dati di input sono separati da virgola, aggiungi -F,prima il modificatore-lane

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.