免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1283 | 回复: 2
打印 上一主题 下一主题

求助:perl实现数据汇总 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-12 20:49 |只看该作者 |倒序浏览
本帖最后由 zhangmaocun 于 2013-01-12 20:54 编辑

文件的内容如下:
a,b,c,d,1,2
b,c,d,2,2,3
a,b,c,d,1,4
前四个都相同的话,第五和第六个分别求和,得到的结果如下:
a,b,c,d,2,6
b,c,d,2,2,3

刚学perl,自己写了个:
#!/usr/bin/perl -w

my $file="/opt/a.txt";
my $line;
my %hash;
open(IN,"<$file");
while($line=<IN>){
chomp($line);
my @rowline = split(/,/, $line);
$a=$rowline[0].",".$rowline[1].",".$rowline[2].",".$rowline[3];
$b=$rowline[4].",".$rowline[5];
if ($hash{$a})
{
my $temp=$hash{$a};
my @temp=split(/,/, $temp);
my $temp1=$temp[0]+$rowline[4];
my $temp2=$temp[1]+$rowline[5];
$hash{$a}=$temp1.",".$temp2;
}
else
{
$hash{$a}=$b;
}
}
close IN;
open (OUT,">b.txt");
while(($key, $value) = each %hash)
{
    print "$key $value\n";
print OUT $key.",".$value."\n";
}
close OUT;
虽然能实现,感觉效率低吧。大数据的话应该慢吧,求个高效率的。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-01-12 21:18 |只看该作者
本帖最后由 rubyish 于 2013-01-12 17:20 编辑

写了个:
  1. #!/usr/bin/perl
  2. my %h;
  3. while (<DATA>) {
  4.     /(.*),(\d+),(\d+)$/;
  5.     if ( $h{$1} ) {
  6.         $h{$1}[0] += $2;
  7.         $h{$1}[1] += $3;
  8.     }
  9.     else { $h{$1} = [ $2, $3 ] }
  10. }
  11. for ( keys %h ) {
  12.     print join( ',', $_, @{ $h{$_} } ), $/;
  13. }

  14. __DATA__
  15. a,b,c,d,1,2
  16. b,c,d,2,2,3
  17. a,b,c,d,1,4
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
3 [报告]
发表于 2013-01-12 23:55 |只看该作者
纯属娱乐
还是楼上的好用
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;
  5. my %hash;
  6. my ($str1,$num1,$num2);
  7. my ($sum1,$sum2);
  8. my @line = <DATA>;
  9. while(<@line>){
  10.     /((?:\w,){4})(\d+),(\d+)(?{($str1,$num1,$num2)=($1,$2,$3)})/;
  11.   while(<@line>){
  12.     if(/$str1(\d+),(\d+)/){
  13.         $sum1+=$1;
  14.         $sum2+=$2;
  15.     }   
  16.   }
  17.   $hash{$1}="$sum1,$sum2";
  18.   undef $sum1;
  19.   undef $sum2;
  20. }
  21. print "$_$hash{$_}\n" for sort keys %hash;
  22. __DATA__
  23. a,b,c,d,1,2
  24. b,c,d,2,2,3
  25. a,b,c,d,1,4
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP