免费注册 查看新帖 |

Chinaunix

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

perl如何提取含特定字符串的2行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-31 21:55 |只看该作者 |倒序浏览
本帖最后由 chuanwj 于 2012-08-01 19:58 编辑

小弟刚刚入门,问个比较简单的问题。

要处理的文件是这样的:(**代表不关心的数据)

*****
*****
start:a/b/c
(abc) 23erq
end:d/e/f/w
(effa) erw wer
*****
***
**
start:a/b/cd
(abc) sef wqer swf
end:d/e/ff/w
(effa) ewe dfw wer
******
start:n/n/e/df
(efe) we3r jpi ef
end:e/f/v/fwe
(ere) erqw w3er i8j
*****
start:a/b/cc
(ef) erq erq ip
end:d/e/ff
(er) iew ip eruj
***
***
文件很长,大概的规律是这样。我想得到的输出格式是:
start:  ##############                                             end:        ##################
start: ###############                                            end:        ##################
start: ###############                                            end:        ##################
start: ###############                                            end:        ##################
start: ###############                                            end:        ##################
(其中####号代表,文件中star后面接的内容【到半半括号截止】,而且最好,前面是相同的都归类在一起,
比如:start:a/b/c    end:d/e/f/w
start:a/b/cd          end:d/e/ff/w
start:a/b/cc          end:d/e/ff
start:n/n/e/df       end:e/f/v/fwe


论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-07-31 23:03 |只看该作者
回复 1# chuanwj


    start还是star?

论坛徽章:
1
天蝎座
日期:2013-10-28 19:28:43
3 [报告]
发表于 2012-08-01 01:30 |只看该作者
/^star:.*$/ .. /^end.*$/

论坛徽章:
0
4 [报告]
发表于 2012-08-01 09:47 |只看该作者
回复 2# yinyuemi


    不好意思,打错了,是start

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2012-08-01 10:00 |只看该作者
回复 1# chuanwj
  1. perl -nle 'if(/start/../end/){
  2. /([^:]+:)(.*)?\(/;if($1 eq "start:"){push @{$hash{$1}},$2;$s=$2;}else{$hash{$s} = $1.$2}
  3. };
  4. END{foreach (sort {$a cmp $b} @{$hash{"start:"}}){print "start: ",$_,"\t",$hash{$_}}}' file
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-08-01 13:59 |只看该作者
这样好像不行回复 3# mitiao


   

论坛徽章:
0
7 [报告]
发表于 2012-08-01 15:07 |只看该作者
回复 5# yinyuemi


    不好意思,如果数据格式是这样
*****
*****
start:wer/ewqre/werqd
(abc) 23erq
end:w2r/er/ew3r/w
(effa) erw wer
*****
***
**
start:efrew/ewqre/werqd
(abc) sef wqer swf
end:23rw/erefe/dfe3r/w
(effa) ewe dfw wer
******
start:2rwe/8ijpi/e3/df
(efe) we3r jpi ef
end:3e8/3ru/erfwej/fwe (ere) erqw w3er i8j
*****
start:a/b/cc
(ef) erq erq ip
end:d/e/ff
(er) iew ip eruj
***
***
又应该如何实现呢?简单地用/start/../end/得到的结果,只能是
start:a/b/cc
(ef) erq erq ip
end:d/e/ff
应该如何得到start:a/b/cc  end:d/e/ff ,并且分类排序?

我是新手,对你所写的脚本还有些不懂,还麻烦指教。
perl -nle 'if(/start/../end/){
/([^:]+(.*)?\(/;   ##此处匹配了开头的:,怎么还要([^:]+呢?
if($1 eq "start:"{push @{$hash{$1}},$2;$s=$2;}else{$hash{$s} = $1.$2}  ##将已经匹配的数据存入到数组

,怎么要用@{$hash{$1}},此时的$1.$2分别代表什么呢?是star匹配到的内容与其后面的内容吗?
};
END{foreach (sort {$a cmp $b} @{$hash{"start:"}}){print "start: ",$_,"\t",$hash{$_}}}' file ##此处经

过排序后,打印出来$_,"\t",$hash{$_},又分别是什么呢?

谢谢!

论坛徽章:
0
8 [报告]
发表于 2012-08-01 19:42 |只看该作者
本帖最后由 kk861123 于 2012-08-01 19:44 编辑

其实我还是没完全看懂啥意思,你要的数据和你写的数据都对不上,先请试试
  1. while (<DATA>) {
  2.     next unless /^start/ || /^end/;
  3.     if (/^start/) {
  4.         chomp;
  5.     }
  6.     print;
  7. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-08-01 20:00 |只看该作者
回复 8# kk861123

已经修改过来了···
主要是我想看看start到end之间的路径的关系


   

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

试试:
  1.     perl -nle 'if(/^start:/ or /^end:/){ # 匹配 flag
  2.     /([^:]+:)(.*)?\(?/; # 正则捕获$1,$2,其中$1是start: 或 end:,$2是'('之前的部分
  3.     if($1 eq "start:"){push @{$hash{$1}},$2;$s=$2;} # 如果$1是start:的话,存入key为$1,值为$2的hash中,另外,再保留一份$2给临时变量$s,
  4.     else{$hash{$s} = $1.$2} # 如果$1不是start:,即是end:, 则存入key为$s,值为$1.$2到hash中
  5.     };
  6.     END{
  7.        use Data::Dumper;
  8.        print Dumper \%hash; # 可以看下hash的结构是什么,应该会理解下面foreach的block部分
  9.        foreach (sort {$a cmp $b} @{$hash{"start:"}}){
  10.           print "start: ",$_,"\t",$hash{$_}
  11.        }
  12.     }' file
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP