d3p*_*3pd 9 variables bash standard-deviation
是否有一些技巧可以让人们使用bc(或其他一些标准实用程序)来返回任意数量的数字的标准偏差?为方便起见,假设数字以下列方式存储在Bash变量中:
myNumbers="0.556
1.456
45.111
7.812
5.001"
Run Code Online (Sandbox Code Playgroud)
所以,我正在寻找的答案将采用如下形式:
standardDeviation="$(echo "${myNumbers}" | <insert magic here>)"
Run Code Online (Sandbox Code Playgroud)
Gil*_*not 12
使用awk:
standardDeviation=$(
echo "$myNumbers" |
awk '{sum+=$1; sumsq+=$1*$1}END{print sqrt(sumsq/NR - (sum/NR)**2)}'
)
echo $standardDeviation
Run Code Online (Sandbox Code Playgroud)
使用perl:
#!/usr/bin/env perl
use strict; use warnings;
use Math::NumberCruncher;
my @data = qw/
0.556
1.456
45.111
7.812
5.001
/;
print Math::NumberCruncher::StandardDeviation(\@data);
Run Code Online (Sandbox Code Playgroud)
16.7631
Run Code Online (Sandbox Code Playgroud)
或者使用 GNU Octave(它比简单的 std 更强大):
standardDeviation="$(echo "${myNumbers}" | octave --eval 'disp(std(scanf("%f")))')"
echo $standardDeviation
Run Code Online (Sandbox Code Playgroud)
输出
18.742
Run Code Online (Sandbox Code Playgroud)
总体标准差:
jq -s '(add/length)as$a|map(pow(.-$a;2))|add/length|sqrt'
ruby -e'a=readlines.map(&:to_f);puts (a.map{|x|(x-a.reduce(:+)/a.length)**2}.reduce(:+)/a.length)**0.5'
jq -s '(map(.*.)|add/length)-pow(add/length;2)|sqrt'
awk '{x+=$0;y+=$0^2}END{print sqrt(y/NR-(x/NR)^2)}'
Run Code Online (Sandbox Code Playgroud)
在中awk
,^
在POSIX中,但**
不是。**
受gawk
,nawk
但不受的支持mawk
。
样本标准差(前两个命令与上面的前两个命令相同,但length
已替换为length-1
):
jq -s '(add/length)as$a|map(pow(.-$a;2))|add/(length-1)|sqrt'
ruby -e'a=readlines.map(&:to_f);puts (a.map{|x|(x-a.reduce(:+)/a.length)**2}.reduce(:+)/(a.length-1))**0.5'
R -q -e 'sd(scan("stdin"))'
Run Code Online (Sandbox Code Playgroud)