Is there a way to get the min, max, median, and average of a list of numbers in a single command?
With GNU datamash:
$ printf '%s\n' 1 2 4 | datamash max 1 min 1 mean 1 median 1
4 1 2.3333333333333 2
You can use the R programming language.
Here is a quick and dirty R script:
#! /usr/bin/env Rscript
d<-scan("stdin", quiet=TRUE)
cat(min(d), max(d), median(d), mean(d), sep="\n")
Note the "stdin"
in scan
which is a special filename to read from standard input (that means from pipes or redirections).
Now you can redirect your data over stdin to the R script:
$ cat datafile
1
2
4
$ ./mmmm.r < datafile
1
4
2
2.333333
Also works for floating points:
$ cat datafile2
1.1
2.2
4.4
$ ./mmmm.r < datafile2
1.1
4.4
2.2
2.566667
If you don't want to write an R script file you can invoke a true one-liner (with linebreak only for readability) in the command line using Rscript
:
$ Rscript -e 'd<-scan("stdin", quiet=TRUE)' \
-e 'cat(min(d), max(d), median(d), mean(d), sep="\n")' < datafile
1
4
2
2.333333
Read the fine R manuals at http://cran.r-project.org/manuals.html.
Unfortunately the full reference is only available in PDF. Another way to read the reference is by typing ?topicname
in the prompt of an interactive R session.
For completeness: there is an R command which outputs all the values you want and more. Unfortunately in a human friendly format which is hard to parse programmatically.
> summary(c(1,2,4))
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 1.500 2.000 2.333 3.000 4.000
I actually keep a little awk program around to give the sum, data count, minimum datum, maximum datum, mean and median of a single column of numeric data (including negative numbers):
#!/bin/sh
sort -n | awk '
BEGIN {
c = 0;
sum = 0;
}
$1 ~ /^(\-)?[0-9]*(\.[0-9]*)?$/ {
a[c++] = $1;
sum += $1;
}
END {
ave = sum / c;
if( (c % 2) == 1 ) {
median = a[ int(c/2) ];
} else {
median = ( a[c/2] + a[c/2-1] ) / 2;
}
OFS="\t";
print sum, c, ave, median, a[0], a[c-1];
}
'
The above script reads from stdin, and prints tab-separated columns of output on a single line.