19

I have a series piped greps, awks and seds which produce a list of numbers, one on each line. Something like this:

1.13
3.59 
1.23

How can i pipe this to something which will output the average, max, and min?

1
  • If you're piping grep, awk and sed together, the same thing can often be done in one invocation of awk. Feb 23 '11 at 23:54
29

Since you're already using 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}'
3
  • Nice, it works for me!
    – JavaRocky
    Feb 23 '11 at 23:44
  • I thought there would of been already a binary which accepts a list of numbers and the count, avg, min, max for you, kind of like using 'time'.
    – JavaRocky
    Feb 23 '11 at 23:45
  • 1
    I would just put the above awk pattern in /usr/local/bin/stats or such, and then use it as blabla | stats.
    – Asclepius
    Aug 29 '13 at 20:11
4

I find this program useful for generating stats on lists of numbers at the command line: http://web.cs.wpi.edu/~claypool/misc/stats/stats.html

0
0

There is also simple-r, which can do almost everything that R can, but with less keystrokes:

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

To calculate average, max, and min, one would have to type one of:

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

With a tip of the hat to @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] is the value in the first (0'th) field of each line

If your input data is comma separated, add the -F, modifier before -lane

0

You can use ministat:

$ ministat -n
1.13
3.59 
1.23

x <stdin>
    N           Min           Max        Median           Avg        Stddev
x   3          1.13          3.59          1.23     1.9833333     1.3923122

And with tail, sed and cut you can extract a single field, e.g. ministat -n | tail -1 | sed -r 's/ +/ /g;' | cut -d\ -f 6 gives you the average (since it: takes the last line; removes extra spaces; then takes the sixth non-space token on the line).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.