如何计算 shell 脚本中不同列的标准差
how to calculate standard deviation from different colums in shell script
我有一个包含 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]=[=12=]; s+=} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print sd}'
任何人都可以建议一种更简单的方法,以便我可以直接沿着每一行进行。
你的意思是这样的吗?
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
您只需使用字段而不是转置和使用行。
你也可以用一张pass做同样的事情。
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
我有一个包含 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]=[=12=]; s+=} END{a=s/NR; for (i in x){ss += (x[i]-a)^2} sd = sqrt(ss/NR); print sd}'
任何人都可以建议一种更简单的方法,以便我可以直接沿着每一行进行。
你的意思是这样的吗?
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
您只需使用字段而不是转置和使用行。
你也可以用一张pass做同样的事情。
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