计算许多文件的平均值

时间:2013-01-29 11:23:28

标签: python perl bash

我想计算多个文件中数据的平均值:(大约10个文件)。可以说我有file1.dat,file2.dat,file3.dat和... file10.dat。 每个文件包含两列。 “第一列是行号”,“第二列是数据”。总共我有1800行文件。数据模式如下所示:

    1.00   0.659
    2.00   0.608
    3.00   0.578
    4.00   0.557
    5.00   0.543
    6.00   0.527
    7.00   0.514
    8.00   0.502
    9.00   0.489
    . 
    .
    .
 1800.00   0.480

我想根据每个文件的行号计算数据的平均值。这意味着,我想找到来自file1,file2 ...和file10的所有第一行数据的平均值,并写入新文件。然后平均来自file1,file2 ...和file10的所有第二行数据,并写入相同的新文件

新文件应该具有以下格式。例如;

    1.00   0.112
    2.00   0.324
    3.00   0.887
    . 
    .

第一列是行号,第二列是数据的平均值。为了清晰起见,我将解释一些细节。在上面的示例中, 0.112 是每个文件第一行中所有数据的平均值。 0.324 是每个文件第二行中所有数据的平均值。

我想要的是可以完成此计算的代码。

我尝试使用perl打开文件。但在尝试将想法转换为代码时丢失了。我写的perl如下所示

#!/usr/bin/perl -w

open (FILE, "file1.dat") or die $!;
while (<FILE>) {
chomp;
print "$_\n";
}
close (FILE);

提前致谢。

3 个答案:

答案 0 :(得分:1)

我几乎忘记了关于bash脚本的所有内容。但我认为你可以做这样的事情。

files=(file1 file2 file3 file4)
for i in `seq  4`
do
  j=$(($i-1))
  f[$j]=`cat ./temp/${files[$i]} | awk '{print $2}' `
done

for i in `seq 0 1799`
do
  sum=0
  rowValue=0
  for j in `seq 0 3`
  do
    fileContent=(${f[$j]})
    rowValue=`echo ${fileContent[$i]} `
    sum=$(($sum + $rowValue))    
  done
  echo "sum is" $i $sum
done

答案 1 :(得分:0)

你问的是指导,而不是代码,然后我可以用gawk告诉我的想法。

gawk有ARGCARGIND以及ARGV,您可以使用它来识别哪个文件。并且对于每个文件,每行保存数据,或仅将您需要的数据保存到二维数组中。比如array[file,line]

最后在END块中,你进行循环,并进行平均计算,打印结果

如果你不了解awk,你也可以在python中应用这个想法,我猜(不确定)perl也应该使用它。

希望它有所帮助。

答案 2 :(得分:0)

打开单独文件句柄上的所有输入文件,然后打开输出文件。执行一个循环,从每个输入文件读取一行,将所有值加在一起并除以文件数,然后将结果写入输出文件。