免费注册 查看新帖 |

Chinaunix

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

如何提取匹配的行, 及匹配行下面连续几行的内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-03 11:07 |只看该作者 |倒序浏览
本帖最后由 kggg 于 2014-12-03 11:51 编辑

如下文件示例, 行首都有一个空格, 第一列是主题, 后面跟的是内容, 如果下一行第一,二列是空的,就是属于上一主题的内容。
如何提取出这些主题及对应的内容呢。


原文件的一部份:
  1. aklsdjk     hh       this is ok   2039023
  2.                           kkk hhh kldkkd  kkkk
  3.                           uuuu  kdk kkk  kkkkkk lll
  4.                           99999 778 888 8887 777
  5. kllllll        dddd    uu  uuuuuuu uuuuuuuuu u
  6. yyyy        uuuu    kkkkkkkkl llll llllllllllllllllllllllll
  7. rrrrr         kkku    kdljsdl klsjdfldk lkkkk kkkkkkk
  8.                            kdslfjlsd kljlkjl kljljl kljlkl ljl
  9.                            klsjfdlsf lkjslf 999999999999
  10. kkkk         kkkkkk  kkkkkkkkkkkkkkkk 888 ll888 88
复制代码
如第二列包含hh, uuuu, kkku的提取出来 , 如下显示的结果 :
  1. aklsdjk     hh       this is ok   2039023
  2.                           kkk hhh kldkkd  kkkk
  3.                           uuuu  kdk kkk  kkkkkk lll
  4.                           99999 778 888 8887 777
  5. yyyy        uuuu    kkkkkkkkl llll llllllllllllllllllllllll
  6. rrrrr         kkku    kdljsdl klsjdfldk lkkkk kkkkkkk
  7.                            kdslfjlsd kljlkjl kljljl kljlkl ljl
  8.                            klsjfdlsf lkjslf 999999999999
复制代码

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
2 [报告]
发表于 2014-12-03 11:35 |只看该作者
想得到什么样的结果?

论坛徽章:
0
3 [报告]
发表于 2014-12-03 11:47 |只看该作者
回复 2# b114213903
  1. aklsdjk     hh       this is ok   2039023
  2.                           kkk hhh kldkkd  kkkk
  3.                           uuuu  kdk kkk  kkkkkk lll
  4.                           99999 778 888 8887 777
  5. yyyy        uuuu    kkkkkkkkl llll llllllllllllllllllllllll
  6. rrrrr         kkku    kdljsdl klsjdfldk lkkkk kkkkkkk
  7.                            kdslfjlsd kljlkjl kljljl kljlkl ljl
  8.                            klsjfdlsf lkjslf 999999999999
复制代码
如果包含hh, uuuu, kkku的显示出来 , 如上所示。

   

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
4 [报告]
发表于 2014-12-03 12:31 |只看该作者
回复 3# kggg
  1. #/usr/bin/perl
  2. use strict;

  3. my $flag=0;
  4. while(my $line=<DATA>){
  5.         if($line=~/^\s\S/){
  6.                 my $seconde=(split /\s+/,$line)[2];
  7.                 if($seconde=~/^(hh)$|^(uuuu)$|^(kkku)$/){
  8.                         $flag=1;
  9.                         print "$line";
  10.                 }else{
  11.                         $flag=0;
  12.                 }
  13.         }elsif($flag){
  14.                 print "$line";
  15.         }
  16. }
  17. <>
  18. __DATA__
  19. aklsdjk     hh       this is ok   2039023
  20.                           kkk hhh kldkkd  kkkk
  21.                           uuuu  kdk kkk  kkkkkk lll
  22.                           99999 778 888 8887 777
  23. kllllll        dddd    uu  uuuuuuu uuuuuuuuu u
  24. yyyy        uuuu    kkkkkkkkl llll llllllllllllllllllllllll
  25. rrrrr         kkku    kdljsdl klsjdfldk lkkkk kkkkkkk
  26.                            kdslfjlsd kljlkjl kljljl kljlkl ljl
  27.                            klsjfdlsf lkjslf 999999999999
  28. kkkk         kkkkkk  kkkkkkkkkkkkkkkk 888 ll888 88
复制代码

论坛徽章:
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
5 [报告]
发表于 2014-12-03 12:57 |只看该作者
回复 3# kggg


$ cat get_huk.pl
use strict;
use warnings;

my $sMatch = 0;
while(<DATA>){
  $sMatch = 0 if(m/^\s\S+/);
  $sMatch = 1 if(m/^\s\S+\s+(hh|uuuu|kkku)\s/);
  print if $sMatch;
}
__DATA__
aklsdjk     hh       this is ok   2039023

                          kkk hhh kldkkd  kkkk
                          uuuu  kdk kkk  kkkkkk lll
                          99999 778 888 8887 777
kllllll        dddd    uu  uuuuuuu uuuuuuuuu u
yyyy        uuuu    kkkkkkkkl llll llllllllllllllllllllllll
rrrrr         kkku    kdljsdl klsjdfldk lkkkk kkkkkkk
                           kdslfjlsd kljlkjl kljljl kljlkl ljl
                           klsjfdlsf lkjslf 999999999999
kkkk         kkkkkk  kkkkkkkkkkkkkkkk 888 ll888 88

$ perl get_huk.pl
aklsdjk     hh       this is ok   2039023

                          kkk hhh kldkkd  kkkk
                          uuuu  kdk kkk  kkkkkk lll
                          99999 778 888 8887 777
yyyy        uuuu    kkkkkkkkl llll llllllllllllllllllllllll
rrrrr         kkku    kdljsdl klsjdfldk lkkkk kkkkkkk
                           kdslfjlsd kljlkjl kljljl kljlkl ljl
                           klsjfdlsf lkjslf 999999999999

   

论坛徽章:
0
6 [报告]
发表于 2014-12-03 14:29 |只看该作者
谢谢两位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP