免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 清泉一边
打印 上一主题 下一主题

统计a文件中某个元素在b文件出现的次数 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
11 [报告]
发表于 2016-08-14 12:13 |只看该作者
本帖最后由 sunzhiguolu 于 2016-08-14 12:48 编辑

回复 6# stanley_tam
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. open (my $FHb, '<', './b');
  5. my (@aChars, %hStat) = ('A' .. 'C');
  6. map {my @aT = split; $hStat{$aT[1]}{$aT[0]}{'Values'} = [@aT[2, -1]]; @{$hStat{$aT[1]}{$aT[0]}}{@aChars} = (0) x 3} <$FHb>;
  7. close ($FHb);
  8. open (my $FHa, '<', './a');
  9. while (defined (local $_ = <$FHa>)){
  10.     my @aA = split;
  11.     while (my ($sKey, $v) = each %{$hStat{$aA[0]}}){
  12.         if ($aA[1] >= $v->{'Values'}->[0] and $aA[1] <= $v->{'Values'}->[-1]){
  13.             $hStat{$aA[0]}{$sKey}{$aA[-1]}++;
  14.         }
  15.     }
  16. }
  17. close ($FHa);
  18. while (my ($id, $v) = each %hStat){
  19.     foreach (keys %$v){
  20.         my $rh = $hStat{$id}{$_};
  21.         print join ("\t", $_, $id, @{$rh->{'Values'}}, @{$rh}{@aChars}), "\n";
  22.     }
  23. }
复制代码
perl abc.pl
----------------------------------------------------------------------------
len_2   01      432     452     0       0       1
len_1   01      330     401     1       3       0
len_3   01      500     600     0       3       4

   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
12 [报告]
发表于 2016-08-14 12:33 |只看该作者
本帖最后由 sunzhiguolu 于 2016-08-14 12:52 编辑

如果只是提取文件 a, b 中某一相关值相等的记录来说, 谁在内, 谁在外 应该结果是一样的. 如果要将文件 a 中的每一条记录都对文件 b 进行统计的话, 那就需要与 a 相关联的句柄在外, 与 b 相关联的句柄在内.
是这个意思吗? 请大家指点一下... 谢谢!!!

论坛徽章:
0
13 [报告]
发表于 2016-08-14 13:59 |只看该作者
while循环内再嵌套句柄的while循环,如果文件很大那真的太占系统资源了。将句柄的内容全部读入列表上下文也太占内存了。

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
14 [报告]
发表于 2016-08-14 14:42 |只看该作者
的确是这个原因。但这样写的确耗时啊。回复 6# stanley_tam


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
15 [报告]
发表于 2016-08-14 14:44 |只看该作者
时间和内存不可兼得啊,while套while试了一下,时间太久了,这次文件不算太大,要时间,不要内存了~回复 13# 华小飞_Perl


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP