Używając bash, jak mogę znaleźć średnią, maksimum i min z listy liczb?


18

Mam szeregowe grepki, awksy i seds, które tworzą listę liczb, po jednej w każdej linii. Coś takiego:

1.13
3.59 
1.23

Jak mogę potokować to do czegoś, co wyświetli średnią, maksimum i min?


Jeśli łączysz grep, awk i sed razem, to samo często można zrobić za pomocą jednego wywołania awk.
Wstrzymano do odwołania.

Odpowiedzi:


27

Ponieważ już korzystasz z 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}'

Fajnie, działa dla mnie!
JavaRocky

Pomyślałem, że byłby już plik binarny, który akceptuje listę liczb i liczbę, śr., Min., Maks. Dla ciebie, coś w rodzaju użycia „czasu”.
JavaRocky

1
Po prostu wstawiłbym powyższy awkwzór /usr/local/bin/stats, a następnie użyłem go jako blabla | stats.
Acumenus


0

Istnieje również simple-r, który może zrobić prawie wszystko, co R, ale z mniejszą liczbą naciśnięć klawiszy:

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

Aby obliczyć średnią, maksimum i min, należałoby wpisać jeden z:

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

0

Z czapką do @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] jest wartością w pierwszym (0-tym) polu każdej linii

Jeśli dane wejściowe są rozdzielone przecinkami, dodaj -F,modyfikator wcześniej-lane

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.