免费注册 查看新帖 |

Chinaunix

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

perl脚本请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-14 18:35 |只看该作者 |倒序浏览
各位大神,请教如何设立flag分段读取文件信息?有没有好懂一些的思路呢?
比如文件如下:

ID    BEGIN    END    INFO
A      1             5        QQ
a       1            2        QQ
a       2            3        QQ

B      22          33       W
C      33          44       W
A      7            15       EE
a      8             10      EE
a      9              11     EE
a      11            13     EE
a      13            15     EE

C      11           22     EE


遇到A开始统计它下边a的范围,并将各个a的范围加和(END-BEGIN的值),再遇到下一个A,统计。比如上边的得到:

A  2  QQ
A  8  EE


论坛徽章:
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
2 [报告]
发表于 2016-11-14 20:46 |只看该作者
本帖最后由 sunzhiguolu 于 2016-11-14 20:50 编辑

回复 1# Eva326
遇到A开始统计它下边a的范围,并将各个a的范围加和(END-BEGIN的值),再遇到下一个A,统计。比如上边的得到:

能否将你的期望得到的结果的要求说的再简单一点.

另外, 你说范围加和是个什么意思 没有搞明白. 特别是遇到下一个 A 统计. 请详细说下.

论坛徽章:
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
3 [报告]
发表于 2016-11-14 20:56 |只看该作者
ID    BEGIN    END    INFO
A      1             5        QQ
a       1            2        QQ   => 1
a       2            3        QQ   => 1
B      22          33       W
C      33          44       W
A      7            15       EE
a      8             10      EE  => 2
a      9              11     EE  => 2
a      11            13     EE  => 2
a      13            15     EE  => 2
C      11           22     EE
我用不同的颜色进行标识的是不是你要表达的范围? 分别统计加和? 2 OR 8?

论坛徽章:
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
4 [报告]
发表于 2016-11-14 21:17 |只看该作者
如果是的话, 试下这个:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($sum, $str) = 0;
  5. while (<DATA>){
  6.     my @aList = split;
  7.     if (/\AA/){
  8.         printf ("a %d $str\n",$sum) if ($sum);
  9.         $sum = 0;
  10.         $str = $aList[-1];
  11.         next;
  12.     }
  13.     $sum += $aList[2] - $aList[1] if (/\Aa/);
  14. }

  15. printf ("a %d $str\n", $sum) if ($sum);

  16. __DATA__
  17. A      1             5        QQ
  18. a       1            2        QQ
  19. a       2            3        QQ
  20. B      22          33       W
  21. C      33          44       W
  22. A      7            15       EE
  23. a      8             10      EE
  24. a      9              11     EE
  25. a      11            13     EE
  26. a      13            15     EE
  27. C      11           22     EE
复制代码

论坛徽章:
0
5 [报告]
发表于 2016-11-21 16:54 |只看该作者
3楼大哥好厉害,看完你的图才懂这题目是啥意思

  1. open FILE, "<", "$file" or die "can't open: $!\n";

  2. my $sum = 0;
  3. my $info = "";

  4. while(<FILE>) {
  5.         next if (/^\s*$/);
  6.         next if (/^\s*#/);
  7.         next if (/^\s*ID/);
  8.        
  9.         chomp;
  10.         if(/^\s*A \s+ \d+ \s+ \d+ \s+ (\w+) $/x) {
  11.                 ($sum) ? (print "A $sum $info\n") : ();
  12.                 $sum = 0;
  13.                 $info = "$1";
  14.         } elsif (/^\s*a \s+ (\d+) \s+ (\d+) \s+ \w+ $/x) {
  15.         $sum += ($2-$1);
  16.         }
  17. }
  18. ($sum) ? (print "A $sum $info\n") : ();

  19. close FILE;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP