日期:2014-05-16 浏览次数:20919 次
#!/usr/bin/perl -w
use strict;
my @key = ();
my %sum = ();
my $index = 0;
my $flag = 0;
my @line = ();
while(<>){
chomp $_;
$flag = 0;
@line = split ' ',$_;
foreach(@key){
if($_ eq $line[0]){
for($index=0;$index<@line-1;$index++){
$sum{"$_$index"} += $line[$index+1];
}
$flag = 1;
}
}
if($flag == 0){
push @key,$line[0];
for($index=0;$index<@line-1;$index++){
$sum{"$line[0]$index"} += $line[$index+1];
}
}
}
foreach(@key){
my $each_key = $_;
my $result = 0;
print $_ . " ";
$index = 0;
while(1){
last if ! $sum{"$each_key$index"};
my $aver = sprintf "%.2f",$sum{"$each_key$index"}/3;
print "$aver ";
$index++;
}
print "\n";
}
------解决方案--------------------
sort -t' ' -k 1,1 filename | awk 'BEGIN{str="";sum1=0;sum2=0;sum3=0}{sum1+=$2;sum2+=$3;sum3+=$4; if(str!=$1 && str!=""){print str,(sum1-$2)/3,(sum2-$3)/3,(sum3-$4)/3; sum1=$2;sum2=$3;sum3=$4} str=$1}END{print str,sum1/3,sum2/3,sum3/3}'
------解决方案--------------------
首先对文件按照第一列进行排序
逐行读取排序后的每一行,并记录行数,累计数值
判断当前第一列与上次读取的第一列是否一致,如果不一致则计算平均值并输出