免费注册 查看新帖 |

Chinaunix

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

perl 多行处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-01 11:07 |只看该作者 |倒序浏览
文件比较大,不方便直接打开处理。

任务是这样的
ABC: 1234
XXXXXXXX
XXXXXXXX
DEF: 34456


需要找到ABC所在的行,拿到后面的数字,然后找到与ABC这一行最近的DEF这一行,同样拿到后面的数字,组成一个hash


我是perl的新手,希望大家给个指点~~~

论坛徽章:
0
2 [报告]
发表于 2011-08-01 11:13 |只看该作者
不方便直接打开处理?不打开咋处理?

论坛徽章:
0
3 [报告]
发表于 2011-08-01 11:23 |只看该作者
楼主的意思大概是不方便一次性读入所有数据吧

那就按行读啊,用个标志来决定是检查ABC还是DEF就可以了啊

比如:

  1. $flag = 0;

  2. while (<FH>)
  3. {
  4.     if ( $flag == 0 )
  5.     {
  6.         if ( $_ =~ /^ABC: (\d+)$/)
  7.         {
  8.             ...
  9.             $flag = 1;
  10.         }
  11.     else
  12.     {
  13.         if ( $_ =~ /^DEF: (\d+)$/)
  14.         {
  15.             ...
  16.             $flag = 0;
  17.         }
  18.     }
  19. }
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-08-01 12:26 |只看该作者
回复 1# alexandnpu


perl -lne 'if(/^ABC/../^DEF/ and /^ABC|^DEF/){$_=~s/\D+//g;print}'

论坛徽章:
0
5 [报告]
发表于 2011-08-01 21:06 |只看该作者
回复 4# yinyuemi


    请问,/^ABC/../^DEF/ 是什么意思?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2011-08-01 21:10 |只看该作者
回复  yinyuemi


    请问,/^ABC/../^DEF/ 是什么意思?
akwhole 发表于 2011-08-01 21:06



    我推荐你无视 4 楼的答案,这个东西比较难理解也很少用

论坛徽章:
0
7 [报告]
发表于 2011-08-02 00:43 |只看该作者
  1. use strict;

  2. my $current = 0;

  3. my $ABC = [];
  4. my $DEF = [];

  5. while (<DATA>)
  6. {
  7.     $current++;
  8.     if ( $_ =~ /^ABC:\s*(\d+)$/)
  9.     {
  10.         push @$ABC, [ $current, $1 ];
  11.     }
  12.     if ( $_ =~ /^DEF:\s*(\d+)$/)
  13.     {
  14.         push @$DEF, [ $current, $1 ];
  15.     }
  16. }

  17. # here we get the ABC and DEF lines infor
  18. # for each ABC line, there is
  19. for my $abc_line (@$ABC){
  20.     my $res = {};
  21.     my $min_dis = $current;
  22.     for my $def_line (@$DEF){
  23.        if(abs($def_line->[0] - $abc_line->[0]) < $min_dis){
  24.            $min_dis = abs($def_line->[0] - $abc_line->[0]);      
  25.            $res->{$abc_line->[1]} = $def_line->[1];
  26.        }
  27.     }
  28.     my ($key, $value) = each %$res;
  29.     print "$key = $value\n";
  30. }


  31. __DATA__
  32. ABC: 1234
  33. XXXXXXXX
  34. FJjlfakjdl
  35. DEF: 1
  36. XXXXXXXXX
  37. ABC: 21543215
  38. XXXXXXXX
  39. jfalkj
  40. DEF: 2
  41. #########
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP