在多个文件中计算平均值
我想要计算多个文件中的数据平均值,大约有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 个回答
首先,打开所有的输入文件,每个文件用一个单独的文件句柄来处理,然后再打开一个输出文件。接着,开始一个循环,从每个输入文件中读取一行数据,把所有的数值加在一起,然后除以文件的数量,最后把结果写入输出文件中。
你之前问的是关于指导,而不是代码,所以我可以分享我对gawk的想法。
gawk有一些工具,比如ARGC
、ARGIND
和ARGV
,这些可以帮助你识别正在处理哪个文件。对于每个文件,你可以把每一行的数据保存起来,或者只保存你需要的数据,放进一个二维数组里,就像这样array[file,line]
。
最后在END块里,你可以进行循环和平均值计算,然后打印结果。
如果你对awk不太了解,你也可以把这个思路用在python上,我猜(不太确定)perl也可以这样用。
希望这对你有帮助。
我几乎忘记了关于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