免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7115 | 回复: 11

对多文本进行统计 [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2013-09-08 12:25 |显示全部楼层
各位大大:
我手头上有三个文件,他们的格式都是一样的,总共5列.如果我想求他们的并集,并且如果前三列相同第四列的数字相加,第五列信息合并.我尝试用多维哈希去做,可是结果并不齐全.应该怎么做呢?
以下是文件格式:
____________________________________________________________________________________
1.505.txt
WINGS 1000 4000 3 3/20_505
WINGS 5000 6000 8 8/20_505
SANLY 2000 4000 9 9/20_505
TINAG 8000 10000 11 11/20_505

2.707.txt
WINGS 1000 4000 3 3/18_707
ANNY 4000 7000 4 4/18_707
MOLLY 3000 4300 5 5/18_707
TINAG 8000 10000 6 6/18_707

3.808.txt
VEELY 2000 4000 4 4/20_808
WINGS 5000 6000 5 5/20_808
ANNY 4000 7000 9 9/20_808
TINAG 8000 10000 4 4/20_808

__________________________________________________________________________________________
结果是:

WINGS 1000 4000 6 3/20_505;3/18_707
WINGS 5000 6000 13 8/20_505;5/20_808
SANLY 2000 4000 9 9/20_505
TINAG 8000 10000 2111/20_505;6/18_707;4/20_808
ANNY 4000 7000 13 4/18_707;9/20_808
MOLLY 3000 4300 5 5/18_707
VEELY 2000 4000 4 4/20_808

_____________________________________________________________________________________________


辛苦各位大大了!

论坛徽章:
0
发表于 2013-09-08 13:26 |显示全部楼层
  1. use strict;
  2. use warnings;
  3. my %hash;
  4. while (<DATA>) {
  5.         chomp;
  6.          my @data = split " ";
  7.          $hash{"$data[0] $data[1] $data[2]"}{'col4'} += $data[3];
  8.          $hash{"$data[0] $data[1] $data[2]"}{'col5'} .= "$data[4];";
  9. }

  10. print "$_ $hash{$_}{'col4'} $hash{$_}{'col5'}\n" foreach (sort keys %hash);
  11. <>;

  12. __DATA__
  13. WINGS 1000 4000 3 3/20_505
  14. WINGS 5000 6000 8 8/20_505
  15. SANLY 2000 4000 9 9/20_505
  16. TINAG 8000 10000 11 11/20_505
  17. WINGS 1000 4000 3 3/18_707
  18. ANNY 4000 7000 4 4/18_707
  19. MOLLY 3000 4300 5 5/18_707
  20. TINAG 8000 10000 6 6/18_707
  21. VEELY 2000 4000 4 4/20_808
  22. WINGS 5000 6000 5 5/20_808
  23. ANNY 4000 7000 9 9/20_808
  24. TINAG 8000 10000 4 4/20_808
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2013-09-08 14:49 |显示全部楼层
回复 1# huang6894

How about this

$ perl comb.pl 505.txt 707.txt 808.txt
WINGS 1000 4000 6 3/20_505;3/18_707
WINGS 5000 6000 8 8/20_505
SANLY 2000 4000 9 9/20_505
TINAG 8000 10000 21 11/20_505;6/18_707;4/20_808
ANNY 4000 7000 13 4/18_707;9/20_808
MOLLY 3000 4300 5 5/18_707
NGS 5000 6000 5 5/20_808

$ cat comb.pl
use strict;
use warnings;

my %hSeg;
my @aKey;

my $sCnt = 0;
while(<>){
  $sCnt++;
  chomp;
  my @aData = split;
  if(@aData != 5){
    print "Line $sCnt error: $_\n";
    next;
  }
  my $sKey = "@aData[0..2]";
  if(exists $hSeg{$sKey}){
    $hSeg{$sKey}{val} += $aData[3];
    $hSeg{$sKey}{str} .= ";$aData[4]";
  }
  else{
    push @aKey, $sKey;
    $hSeg{$sKey}{val} = $aData[3];
    $hSeg{$sKey}{str} = $aData[4];
  }
}

#foreach(keys %hSeg){  
foreach(@aKey){
  print "$_ $hSeg{$_}{val} $hSeg{$_}{str}\n";
}


   

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2013-09-08 15:07 来自手机 |显示全部楼层
太感谢您了。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2013-09-08 15:07 来自手机 |显示全部楼层
太感谢您了。

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2013-09-08 15:08 来自手机 |显示全部楼层
so much thanks

论坛徽章:
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
发表于 2013-09-08 22:29 |显示全部楼层
本帖最后由 rubyish 于 2013-09-08 18:29 编辑

试一下:
  1. perl abc.pl 505.txt 707.txt 808.txt
复制代码
  1. #!/usr/bin/perl
  2. use 5.018;
  3. my %d;
  4. while (<>) {
  5.     my ( $n, $t, @k ) = (split)[ 3, 4, 0 .. 2 ];
  6.     $d{"@k"}[0] += $n;
  7.     $d{"@k"}[1] .= $d{"@k"}[1] ? ";$t" : $t;
  8. }
  9. say join ' ', $_, @{ $d{$_} } for keys %d;
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 又涨姿势了!!!

查看全部评分

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2013-09-09 00:04 |显示全部楼层
回复 7# rubyish


    glad!因为开始没想到合并之后再处理....非常感谢各位大大!

论坛徽章:
1
巨蟹座
日期:2014-01-02 15:25:59
发表于 2014-01-08 14:20 |显示全部楼层
回复 7# rubyish


    syntax error at comb.pl line 9, near "say join"
我尝试运行了下,发现存在上面这个问题。。。

论坛徽章:
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
发表于 2014-01-09 06:43 |显示全部楼层
回复 9# chunjiahua

maybe:
use X;   # X >=  5.010
  1. use 5.018;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP