日期:2014-05-16 浏览次数:20790 次
#!/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}'
------解决方案--------------------
首先对文件按照第一列进行排序
逐行读取排序后的每一行,并记录行数,累计数值
判断当前第一列与上次读取的第一列是否一致,如果不一致则计算平均值并输出