首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux~shell~请问文件中数据计算有关问题

2012-09-15 
linux~shell~请教文件中数据计算问题文件内容如下:A1.52.54.0B1.23.215.55B2.33.23.33A1.252.33.77A4.361.

linux~shell~请教文件中数据计算问题
文件内容如下:
A 1.5 2.5 4.0
B 1.2 3.21 5.55
B 2.3 3.2 3.33
A 1.25 2.3 3.77
A 4.36 1.5 2.5
C 1.1 2.3 3.41

要求对每一个字母相同的行分别求平均值,即:
 对包含‘A’的行:(1.5+1.25+4.36)/3 (2.5+2.3+1.5)/3 (4.0+3.77+2.5)/3
 ......

最终输出文件内容:
A X X X
B X X X
C X X X

谁能帮帮我啊,谢谢啦~~~

[解决办法]
我最近在学习perl 还是用perl实现了一个 可是有点长 用sort和awk应该容易
下面的内容保存成sum.pl 然后
chmod +x sum.pl
然后执行的时候把文件当成参数传入
./sum.pl /path/filename

PHP code
#!/usr/bin/perl -wuse 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}'
[解决办法]
首先对文件按照第一列进行排序
逐行读取排序后的每一行,并记录行数,累计数值
判断当前第一列与上次读取的第一列是否一致,如果不一致则计算平均值并输出

热点排行