如何计算shell脚本中不同列的标准差

时间:2015-07-13 06:53:16

标签: linux shell awk stdev

我有一个包含10列的数据文件,如下所示

ifile.txt
2  4  4  2  1  2  2  4  2  1
3  3  1  5  3  3  4  5  3  3
4  3  3  2  2  1  2  3  4  2
5  3  1  3  1  2  4  5  6  8

我想添加第11列,它将显示沿10列的每行的标准偏差。即STDEV(2 4 4 2 1 2 2 4 2 1),依此类推。 我可以通过转移,然后使用以下命令再次进行转置

awk '{x[NR]=$0; s+=$1} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print sd}'

任何人都可以提出一种更简单的方法,以便我可以直接在每一行进行。

2 个答案:

答案 0 :(得分:3)

You can do the same with one pass as well.

 awk '{for(i=1;i<=NF;i++){s+=$i;ss+=$i*$i}m=s/NF;$(NF+1)=sqrt(ss/NF-m*m);s=ss=0}1' ifile.txt

答案 1 :(得分:2)

你的意思是这样吗?

awk '{for(i=1;i<=NF;i++)s+=$i;M=s/NF;
      for(i=1;i<=NF;i++)sd+=(($i-M)^2);$(NF+1)=sqrt(sd/NF);M=sd=s=0}1' file

2 4 4 2 1 2 2 4 2 1 1.11355
3 3 1 5 3 3 4 5 3 3 1.1
4 3 3 2 2 1 2 3 4 2 0.916515
5 3 1 3 1 2 4 5 6 8 2.13542

您只需使用字段而不是转置和使用行。