需要使用bash和awk计算数组的标准偏差?

时间:2015-02-02 05:28:55

标签: bash awk gawk

伙计们我是awk的新手,我正在努力寻找标准偏差的awk命令。

我使用以下内容得到了意思:

echo ${GfieldList[@]} | awk 'NF {sum=0;for (i=1;i<=NF;i++)sum+=$i; print "Mean= " sum / NF; }'

标准偏差公式为:

sqrt((1/N)*(sum of (value - mean)^2))

我使用上面的公式找到了平均值

你们可以帮我解决这个问题的awk命令吗?

2 个答案:

答案 0 :(得分:4)

standard deviation的替代公式是数量的平方根:(均方值减去均值的平方)。这用在下面:

$ echo 20 21 22 | awk 'NF {sum=0;ssq=0;for (i=1;i<=NF;i++){sum+=$i;ssq+=$i**2}; print "Std Dev=" (ssq/NF-(sum/NF)**2)**0.5}'
Std Dev=0.816497

注意:

  • awk中,NF是一行中“字段”的数量。在我们的例子中,每个字段都是一个数字,因此NF是给定行上的数字数。

  • ssq是该行上每个数字的平方和。因此,ssq/NF是均方。

  • sum是该行数字的总和。因此,sum/NF是平均值,(sum/NF)**2是平均值的平方。

  • 根据公式,标准差为(ssq/NF-(sum/NF)**2)**0.5

awk代码

  • NF

    这是一个条件:只有当该行上的字段数NF计算为真,表示非零时,才会执行后面的语句。换句话说,这种情况会导致跳过空行。

  • sum=0;ssq=0;

    这会将sumssq初始化为零。只有在有多行输入时才需要这样做。

  • for (i=1;i<=NF;i++){sum+=$i;ssq+=$i**2}

    这会将sum中所有数字的总和以及ssq中数字的平方和加起来。

  • print "Std Dev=" (ssq/NF-(sum/NF)**2)**0.5

    打印出标准偏差。

答案 1 :(得分:2)

一旦你知道平均值:

awk '{
    for (i = 1;i <= NF; i++) {
        sum += $i
    };
    print sum / NF
}' # for 2, 4, 4, 4, 5, 5, 7, 9 gives 5

然后可以找到标准偏差:

awk -vM=5 '{
    for (i = 1; i <= NF; i++) {
        sum += ($i-M) * ($i-M)
    };
    print sqrt (sum / NF)
}' # for 2, 4, 4, 4, 5, 5, 7, 9 gives 2

In&#34;压缩&#34;形式:

awk '{for(i=1;i<=NF;i++){sum+=$i};print sum/NF}'
awk -vM=5 '{for(i=1;i<=NF;i++){sum+=($i-M)*($i-M)};print sqrt(sum/NF)}'

(将M的值更改为从第一个命令中提取的实际平均值。)