+ -
当前位置:首页 → 问答吧 → 救命呀,perl求和及过滤难题

救命呀,perl求和及过滤难题

时间:2010-10-08

来源:互联网

各位大虾们,小弟跪求解决方法,因工作需要,需对文本文件中的数据进行累加求和及过滤,文本文件中的内容如下:
列1       列2
aaaa     3
bbbb     2
cccc       9
dddd     4
eeee    1
aaaa    4
aaaa    2
eeee    2
bbbb    2

小弟想要得到结果是:如果《列1》中有重复的数据,则去重,并且累加《列2》中值;如果累计后的《列2》值小于5,就把此列过滤掉。
结果:
列1       列2
aaaa     9
cccc       9

小弟在线等,还请大虾们多多指教~

作者: ontherd   发布时间: 2010-10-08

本帖最后由 longbow0 于 2010-10-08 15:53 编辑
  1. my %data;

  2. while (<FH>) {
  3.     my ($key, $val) = split /\s+/;
  4.    
  5.     if (defined $data{$key}) {
  6.         $data{$key} += $val;
  7.     }
  8.     else {
  9.         $data{$key} = $val;
  10.     }
  11. }

  12. for my $key (sort keys(%data)) {
  13.     next if $data{$key} < 5;

  14.     print $key, "\t", $data{$key}, "\n";
  15. }
复制代码

作者: longbow0   发布时间: 2010-10-08

本帖最后由 珞水的大叔 于 2010-10-08 15:35 编辑

试试这个
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;



  4. my %result = ();
  5. my $title;
  6. while(<DATA>){
  7.     chomp;
  8.     if($. == 1){
  9.         $title = $_;
  10.         next;
  11.     }
  12.     my ($key,$value) = split /\s+/,$_;
  13.     $result{$key} += $value;
  14. }

  15. print $title,"\n";
  16. for(sort keys %result){
  17.     print "$_ $result{$_}\n" if $result{$_} >= 5;
  18. }


  19. exit;

  20. __DATA__
  21. 列1    列2
  22. aaaa     3
  23. bbbb     2
  24. cccc     9
  25. dddd     4
  26. eeee    1
  27. aaaa    4
  28. aaaa    2
  29. eeee    2
  30. bbbb    2
复制代码
如果不管标题列,那么下面的更有趣:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;



  4. my %result = ();
  5. grep { my ($key,$value) = split /\s+/,$_;$result{$key} += $value } <DATA>;
  6. grep { print "$_ $result{$_}\n" if $result{$_} >= 5 }sort keys %result;

  7. exit;

  8. __DATA__
  9. aaaa     3
  10. bbbb     2
  11. cccc     9
  12. dddd     4
  13. eeee    1
  14. aaaa    4
  15. aaaa    2
  16. eeee    2
  17. bbbb    2
复制代码

作者: 珞水的大叔   发布时间: 2010-10-08

回复 珞水的大叔


    小弟想咨询下:
$result{$key} += $value;
上面这句这么理解,还请您给些文字性描述。

作者: ontherd   发布时间: 2010-10-08

回复 longbow0


    非常谢谢您,

作者: ontherd   发布时间: 2010-10-08

本帖最后由 珞水的大叔 于 2010-10-08 16:02 编辑

回复 ontherd


    $result{$key} = $result{$key} + $value;

    不会你没有用过hash吧……

作者: 珞水的大叔   发布时间: 2010-10-08

回复 珞水的大叔


    呵呵~~~,说来惭愧。经过你的讲解,现在已经理解了。

小弟,还有个问题想问您下:
在Linux下,我刚才试了您写的perl program来处理500万条数据,CPU就上升到90%左右,难道perl不能处理大批量的数据吗???

作者: ontherd   发布时间: 2010-10-08

难道为了处理得快一点,CPU占用率高一点是过错吗?

作者: wxlfh   发布时间: 2010-10-08

回复 ontherd


    你不会是吧500万的数据贴到了脚本里面的__DATA__之后了吧……

作者: 珞水的大叔   发布时间: 2010-10-08

,主要是在现网服务器上运行,我们有监控,cpu高于80%就报警。

作者: ontherd   发布时间: 2010-10-08

,主要是在现网服务器上运行,我们有监控,cpu高于80%就报警。

作者: ontherd   发布时间: 2010-10-08

,主要是在现网服务器上运行,我们有监控,cpu高于80%就报警。

作者: ontherd   发布时间: 2010-10-08

回复 珞水的大叔


        我在里面加了一行代码:
   if (! open DATA,"<","文本文件.txt" {
die "cannot open datafile!";
}

不知道是不是您说的把数据都加到了____DATA____   里了。

作者: ontherd   发布时间: 2010-10-08

回复 ontherd


    哦,不用放到脚本里
   至于为什么占用cpu这么多我也没有遇到过……
    请达人们help解答一下

作者: 珞水的大叔   发布时间: 2010-10-08