En utilisant bash, comment puis-je trouver la moyenne, le max et le min dans une liste de nombres?

18

J'ai une série de greps, awks et seds canalisés qui produisent une liste de nombres, un sur chaque ligne. Quelque chose comme ça:

1.13
3.59 
1.23

Comment puis-je diriger cela vers quelque chose qui produira la moyenne, le max et le min?

JavaRocky
la source
Si vous canalisez grep, awk et sed ensemble, la même chose peut souvent être faite en une seule invocation de awk.
pause jusqu'à nouvel ordre.

Réponses:

27

Puisque vous utilisez déjà 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
la source
Sympa, ça marche pour moi!
JavaRocky
Je pensais qu'il y aurait déjà eu un binaire qui accepte une liste de nombres et le nombre, moy, min, max pour vous, un peu comme utiliser 'time'.
JavaRocky
1
Je voudrais simplement mettre le awkmodèle ci-dessus dans /usr/local/bin/statsou tel, puis l'utiliser comme blabla | stats.
Acumenus
0

Il y a aussi simple-r, qui peut faire presque tout ce que R peut faire, mais avec moins de touches:

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

Pour calculer la moyenne, le max et le min, il faudrait taper l'un de:

r summary file.txt
r summary - < file.txt
cat file.txt | r summary -
user192124
la source
0

Avec un coup de chapeau à @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] est la valeur dans le premier (0'ème) champ de chaque ligne

Si vos données d'entrée sont séparées par des virgules, ajoutez le -F,modificateur avant-lane

Chris Koknat
la source