一个Perl对文本处理问题!急,请高手赐教

一个Perl对文本处理问题!急,请高手赐教

现描述如下:一个文件中的内容如下:
DS-SERVER-0001|1|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|2|0|0
DS-SERVER-0001|1|0|0
null|0|0|0
null|0|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|19|0|0
DS-SERVER-0001|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0001|0|0|0
DS-SERVER-0011|0|0|0
现在要进行如下处理:将每一行的第一个元素比如说"DS-SERVER-0001"凡是每行第一个元素和它相同的,只能出现一次,并且要求后面三项比如说1|0|0要和其相同的项依次相加比如说另一行为19|0|0,其各项相加后的结果就为20|0|0即1和19相加,0和0相加,0和0相加,总之要保证每行第一个元素相同的行只能出现一次,后面3个元素分别累计求和
上面的最终结果应该是这样的:

DS-SERVER-0001|26|0|0
null|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-00011|0|0|0
用关联数组,取得第一部分作为key,后面的作为value。
每读取一行,判断关联数组里面是否已经存在此key,有:取出值与现在的值分别split后对应相加,存之;没有则直接存之。
最后把关联数组全部输出即可。

效率不是最高的,但很简单。
我以前是用二维数组写的,到最后实在是写不下去了,想要的功能也没实现,急啊^^谁能给我个用关联数组实现的代码?
#!/USR/bin/perl -w
use strict;
my $file='file.txt';
my %tt;
open FH,$file || die "cant open $file \n";
while (<FH>) {
  my @one_line=split ("|",$_);
  ($tt{$one_line[0]})->[0]+=$one_line[1] ;
  ($tt{$one_line[0]})->[1]+=$one_line[2] ;
  ($tt{$one_line[0]})->[2]+=$one_line[3] ;
      }
2楼兄弟!能给个代码实现吗?等着交,我是刚开始学Perl的,谢谢了
$tt{$one_line[0]})->[0]+=$one_line[1] 这一句中“->[0]”是什么意思?楼上给解释一下把
4楼都给你写好了(没有看到?),再加上输出就可以了。
use strict;
my $file='file.txt';
my %tt;
my $key;
open FH,$file || die "cant open $file \n";
while (<FH>) {
        my @one_line=split (/\|/,$_);
  ($tt{$one_line[0]})->[0]+=$one_line[1] ;
  ($tt{$one_line[0]})->[1]+=$one_line[2] ;
  ($tt{$one_line[0]})->[2]+=$one_line[3] ;
}
foreach $key (sort keys %tt){
        print "$key\|$tt{$key}->[0]\|$tt{$key}->[1]\|$tt{$key}->[2]\n";
}


[Copy to clipboard] [ - ]
CODE:
flw@debian:~$ cat foo
DS-SERVER-0001|1|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|2|0|0
DS-SERVER-0001|1|0|0
null|0|0|0
null|0|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|1|0|0
DS-SERVER-0001|19|0|0
DS-SERVER-0001|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0001|0|0|0
DS-SERVER-0011|0|0|0
flw@debian:~$ perl -F'\|' -lane '$h{$F[0]}->[$_-1]+=$F[$_] for(1..3); END{print join("|", $_, @{$h{$_}}) for sort keys %h}' foo
DS-SERVER-0001|26|0|0
DS-SERVER-0009|0|0|0
DS-SERVER-0011|0|0|0
null|0|0|0
flw@debian:~$

搞定了,谢谢各位大哥了
版主可否把这个命令行转换成win下面的格式?我用下面的这个怎么不行呢?

[Copy to clipboard] [ - ]
CODE:
perl -F^| -lane "$h{$F[0]}->[$_-1]+=$F[$_] for(1..3); END{print join('|', $_, @{$h{$_}}) for sort keys %h}" o.txt

结果是:

QUOTE:
D|0|0|0
n|0|0|0

o.txt 文件的内容和你foo文件的内容一样。