linux - 在 bash 中计算方差

标签 linux bash awk statistics variance

我想像这样计算输入 txt 文件的方差:

1, 5
2, 5
3, 5
4, 10

我希望输出如下:

1, 0
2, 0 
3, 0
4, 4.6875

我用过这条线:

awk '{c[NR]=$2; s=s+c[NR]; avg= s / NR; var=var+(($2 - avg)^2 / (NR )); print var }' inputfile > outputfile

最佳答案

http://www.mathsisfun.com/data/standard-deviation.html 中描述了标准差公式

所以基本上你需要说:

for i in items
   sum += [(item - average)^2]/#items

在您的示例输入中执行此操作:

5   av=5/1=5       var=(5-5)/1=0
5   av=10/2=5      var=(5-5)^2+(5-5)^2/2=0
5   av=15/3=5      var=3*(5-5)^2/3=0
10  av=25/4=6.25   var=3*(5-6.25)^2+(10-6.25)^2/4=4.6875

所以在 awk 中我们可以说:

$ awk 'BEGIN {FS=OFS=","}      # set comma as field input/output separator
       {a[NR]=$2               # store data in an array
        sum+=a[NR]             # keep track of the sum
        av=sum/NR              # calculate average so far
        v=0                    # reset counter for variance
        for (i=1;i<=NR;i++)    # loop through all the values
             v+=(a[i]-av)^2    # calculate the variance
        print $1, v/NR}        # print the 1st field + result
  ' file

测试

$ awk 'BEGIN {FS=OFS=","} {a[NR]=$2; sum+=a[NR]; av=sum/NR; v=0; for (i=1;i<=NR;i++) v+=(a[i]-av)^2; print $1, v/NR}' a
1,0
2,0
3,0
4,4.6875

关于linux - 在 bash 中计算方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758939/

相关文章:

linux - 自动登录网站并下载文件的脚本

linux - 打开屏幕在bash文件中获取PID

c# - .NET 为 Unix 系统(Icinga 或 Nagios)编写文本文件

java - 在 AIX 上设置命令输出的列宽

linux - 忽略 find 命令中的目录

linux - 如何在 Ubuntu 启动时加载自定义模块?

bash - 使用 sed 从 URL 中删除最后一个反斜杠

linux - 我怎样才能在每次启动时运行我自己的脚本

awk - Gawk 单行字节解释器不将 1 和 01 视为相同

python - 如何为每个字符分配值并使用 python 或 awk 找到平均值?