一个计算方差的bash函数,使用bc进行计算,默认精度是20(bc的-l选项)
join(){ # Concatenate arguments with seperator # like implode() in PHP or string.join() in python local ret="" local seperator=$1 shift for i in $@ do if [[ -z $ret ]] then ret=$i else ret="${ret}${seperator}${i}" fi done echo $ret } variance(){ local total=`join '+' $@|bc -l` local average=`echo "${total}/$#"|bc -l` local d=0 for i in $@ do d=`echo "$d+($i-$average)^2"|bc -l` done echo "$d/$#"|bc -l }
2011-07-17 UPDATE:
haohaolee在留言中给出了另一种简单的join()函数的实现,所以整个variance()函数可以简化如下:
variance(){ IFS=+ local total=$( echo $*|bc -l ) local average=$( echo "${total}/$#"|bc -l ) local d=0 for i in $@ do d=$( echo "$d+($i-$average)^2"|bc -l ) done echo "$d/$#"|bc -l }
P.S.顺便把``方式的subshell换成了$()方式
使用方法:
$ variance 1 2 3 .66666666666666666666 $ variance 1 1 1 0.00000000000000000000
Comments !