伙计们我是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命令吗?
答案 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;
这会将sum
和ssq
初始化为零。只有在有多行输入时才需要这样做。
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
的值更改为从第一个命令中提取的实际平均值。)