首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组算法bash shell

数组算法bash shell
EN

Stack Overflow用户
提问于 2014-10-28 15:07:09
回答 1查看 315关注 0票数 0

我有numerous(nTotal)数量的文件,每个文件都有一列长度为L的浮点数,我想在所有这些文件的一行i_th中添加条目。计算其平均值和标准差。我首先读了每个文件。然后我尝试将这个数组添加到一个数组中,这会给我一个语法错误:(standard_in) 2:语法错误。我希望sumai包含所有文件行i_th上所有条目的和。然后,我发现我按照建议更改了循环的平均编辑

代码语言:javascript
复制
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生成带有一列浮点数的文件。

但是,为了找到标准偏差,我再次读取数据文件并将它们存储在数组中(我确信这不是最聪明的方法,但我想不出任何其他的方法)。我也无法使用以下方法找到标准偏差:

代码语言:javascript
复制
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元素的零值,我不知道哪里出了问题。如果你能指导我解决这个问题,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 06:17:35

对于这个问题,Bash可能不是最简单的,特别是因为它没有实现非整数算法。我会用awk:

代码语言:javascript
复制
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更有用。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26611715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档