在多个文件中计算平均值

-6 投票
3 回答
543 浏览
提问于 2025-04-17 14:02

我想要计算多个文件中的数据平均值,大约有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中所有第一行数据的平均值,然后把这个结果写入一个新文件。接着,再计算所有第二行数据的平均值,同样写入这个新文件

这个新文件的格式应该是这样的。例如:

    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

首先,打开所有的输入文件,每个文件用一个单独的文件句柄来处理,然后再打开一个输出文件。接着,开始一个循环,从每个输入文件中读取一行数据,把所有的数值加在一起,然后除以文件的数量,最后把结果写入输出文件中。

0

你之前问的是关于指导,而不是代码,所以我可以分享我对gawk的想法。

gawk有一些工具,比如ARGCARGINDARGV,这些可以帮助你识别正在处理哪个文件。对于每个文件,你可以把每一行的数据保存起来,或者只保存你需要的数据,放进一个二维数组里,就像这样array[file,line]

最后在END块里,你可以进行循环和平均值计算,然后打印结果。

如果你对awk不太了解,你也可以把这个思路用在python上,我猜(不太确定)perl也可以这样用。

希望这对你有帮助。

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

撰写回答