我有numerous(nTotal)数量的文件,每个文件都有一列长度为L的浮点数,我想在所有这些文件的一行i_th中添加条目。计算其平均值和标准差。我首先读了每个文件。然后我尝试将这个数组添加到一个数组中,这会给我一个语法错误:(standard_in) 2:语法错误。我希望sumai包含所有文件行i_th上所有条目的和。然后,我发现我按照建议更改了循环的平均编辑。
for (( n= 1 ; n < $nTotal; n++ ))
do
IFS=$'\n'
arr1=($(./a.out filename | sed 's/:.*//'))
for (( i= 1 ; i < $L; i++ ))
do
sum[i]=`echo "${sum[i]} - ${arr1[i]}" | bc`
done
done
for (( i= 1 ; i < $L; i++ ))
do
ya=$(echo -1*${sum[i]} | bc)
aveSum=$(echo $ya/$nTotal | bc -l)
done编辑: ./a.out生成带有一列浮点数的文件。
但是,为了找到标准偏差,我再次读取数据文件并将它们存储在数组中(我确信这不是最聪明的方法,但我想不出任何其他的方法)。我也无法使用以下方法找到标准偏差:
for (( i= 1 ; i < $L; i++ ))
do
ya=$(echo -1*${sum[i]} | bc)
ta=$(echo $ya/$nTotal | bc -l)
tempval=`echo "${arr1[i]} - $ta * ${arr1[i]} - $ta" | bc`
val[i]=`echo "${val[i]} - $tempval" | bc`
done这里我得到了vali元素的零值,我不知道哪里出了问题。如果你能指导我解决这个问题,我会非常感激的。
发布于 2014-10-29 06:17:35
对于这个问题,Bash可能不是最简单的,特别是因为它没有实现非整数算法。我会用awk:
awk '{ n[FNR]++;
delta = $1 - mean[FNR];
mean[FNR] += delta / n[FNR];
m2[FNR] += delta * ($1 - mean[FNR]);
}
END {for (i=1; i in n; ++i)
print mean[i], sqrt(m2[i]/(n[i]-1));
}' file1 file2 ...这个数学是直接取自著名的“联机”均值和方差算法。该程序假定所有文件都有确切的L行,但是如果少数文件有多少行,丢失的数据就会被忽略;您可能希望做一个更好的有效性测试。在只有一个文件有太多行的特殊情况下,标准偏差计算会将除以零捕获;在一次读取中,这并不重要,因为正确的数据已经被打印出来,但是您可能也想修复这个问题。
该程序使用了几个awk特性:首先,数组被自动初始化为0(如果用作数字);第二,FNR是当前文件中的行号。(NR是整个输入中的行号,但在本例中,FNR更有用。)
https://stackoverflow.com/questions/26611715
复制相似问题