免费注册 查看新帖 |

Chinaunix

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

perl检查文本,这个没有人会了吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-03 16:37 |只看该作者 |倒序浏览
本帖最后由 南宫慕容007 于 2016-05-03 17:08 编辑

需要检查的文本格式如下(其中两段):
"chengwenqiang_near_013_stn1.rec"
0 4700000 sil -2387.083252 !SENT_START
4700000 5100000 k-b+i1 -302.597351 并
5100000 6100000 b-i4+ng -734.077454
6100000 6800000 i4-ng+b -512.013428
6800000 6800000 sp -0.003945
6800000 7500000 m-b+u1 -468.067230 不
7500000 8800000 iao1-u4+f -958.988708
8800000 8800000 sp -0.003945
8800000 9500000 u2-f+a2 -428.034058 反映
9500000 10300000 f-a3+n -506.500671
10300000 11300000 ao3-n+y -531.887451
11300000 11800000 d-y+i1 -300.428864
11800000 12700000 ng-i4+ng -497.844360
12700000 13600000 i3-ng+sil -585.250793
13600000 13800000 sil -146.106827
13800000 15000000 sil-e2+l -806.901611 俄罗斯
15000000 15600000 e2-l+uai1 -417.233917
15600000 16400000 l-uo2+s -580.261353
16400000 17600000 uo2-s+ia1 -747.893921
17600000 18200000 s-i1+d -396.709656
18200000 18200000 sp -0.003945
18200000 18700000 i1-d+e5 -355.250977 的
18700000 19500000 g-e5+q -524.110657
19500000 19500000 sp -0.003945
19500000 20500000 e5-q+ia1 -673.961609 潜力
20500000 21200000 q-ia2+n -436.561737
21200000 22100000 iu2-n+l -565.277527
22100000 23400000 d-l+i1 -814.190063
23400000 25200000 l-i4+sil -1138.360718
25200000 25200000 sp -0.003945
25200000 30700000 sil -2824.102051 !SENT_START
.
"chengwenqiang_near_013_stn2.rec"
0 4700000 sil -2540.468994 !SENT_START
4700000 5200000 sh-p+i2 -378.305511 平均
5200000 6100000 k-i2+ng -647.795959
6100000 7300000 i2-ng+j -857.231262
7300000 8000000 m-j+u1 -559.893005
8000000 9400000 q-u1+n -873.364685
9400000 9800000 er3-n+y -243.902496
9800000 9800000 sp -0.003945
9800000 10500000 r-y+ia1 -426.244324 月薪
10500000 12100000 uo3-ue4+x -1055.373901
12100000 13300000 ue1-x+i1 -739.117004
13300000 14200000 f-i1+n -581.456116
14200000 15900000 i1-n+sil -1161.868530
15900000 16800000 sil -482.444672
16800000 17600000 s-y+uai4 -555.445923 一百
17600000 18300000 y-i4+b -479.175873
18300000 19100000 i5-b+ai3 -589.891968
19100000 19900000 b-ai3+w -511.238281
19900000 19900000 sp -0.003945
19900000 20600000 ai2-w+u1 -423.596558 五十
20600000 21300000 w-u3+sh -478.549774
21300000 22400000 u3-sh+i2 -924.412903
22400000 22900000 sh-i2+m -398.364105
22900000 22900000 sp -0.003945
22900000 23400000 i5-m+ei1 -315.483002 美元
23400000 23900000 m-ei3+y -264.799408
23900000 24600000 ei3-y+ua2 -358.792236
24600000 25500000 y-ua2+n -463.112457
25500000 26500000 ua2-n+z -592.110840
26500000 26500000 sp -0.003945
26500000 27300000 n-z+ua1 -537.829163 左右
27300000 28300000 j-uo3+y -643.170410
28300000 29400000 uo4-y+ou4 -644.249451
29400000 30900000 y-ou4+uai1 -1013.117310
30900000 36100000 sil -2687.381104
36100000 36600000 sil -249.693359 !SENT_START
.
确保每一段的第二行和倒数第二行都以!SENT_START结尾(最后一行是一个句号),如果不满足则打印出该段的第一行:

论坛徽章:
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-05-03 18:10 |只看该作者
回复 1# 南宫慕容007

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($sRegx, @aData) = (qr/!SENT_START\s*\z/);
  5. while (<>){
  6.     if (!/\A\s*\./){
  7.         push @aData, $_;
  8.         next;
  9.     }
  10.     $aData[1] =~ /$sRegx/ and $aData[-1] =~ /$sRegx/ ? print @aData : print $aData[0];
  11.     @aData = ();
  12. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-05-04 10:09 |只看该作者
my ($sRegx, @aData) = (qr/!SENT_START\s*\z/);这行代码的意思是创建一个正则表达式赋给$sRegx吧,那@aData出现在这里干嘛回复 2# sunzhiguolu


   

论坛徽章:
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-05-04 10:33 |只看该作者
回复 3# 南宫慕容007
my ($sRegx, @aData) = (qr/!SENT_START\s*\z/);
等价于下面这样:
my $sRegx = qr/!SENT_START\s*\z/;
my @aData;

   

论坛徽章:
0
5 [报告]
发表于 2016-05-04 10:40 |只看该作者
我怎么这么水,表示好尴尬,后来想到这个和python里面的赋值挺像的,赋值两边长度可以不一样回复 4# sunzhiguolu


   

论坛徽章:
0
6 [报告]
发表于 2016-05-04 11:06 |只看该作者
本帖最后由 南宫慕容007 于 2016-05-04 11:15 编辑

my ($sRegx, @aData) = (qr/!SENT_START\s*\z/);#创建正则表达式,赋值给$sRegx
while (<>){                                                       #逐行读取数据
    if (!/\A\s*\./){                                               #如果该行不匹配正则表达式(该行不是一个句号)
        push @aData, $_;                                      #将该行放在@aData数组里面
        next;                                                     #进行下次循环,读取下一行数据(读取下一行时@data数组是如何变化的?,实在原来@aData数组后面加一行数据吗)
    }

    $aData[1] =~ /$sRegx/ and $aData[-1] =~ /$sRegx/ ? print @aData : print $aData[0];#如果@aData数组的第二个和倒数第一个匹配正则表达式,则打印出该数组,否则打印出该数                                                                                                                                                                                          

                                                                                                                               #组的第一个(我想把匹配的和不匹配的分开输出到两个文件里去,在linux系统下
    @aData = ();                                                                                                        #把aData数组置空
}
回复 2# sunzhiguolu


   

论坛徽章:
0
7 [报告]
发表于 2016-05-04 11:17 |只看该作者
我看了一个早上,总算是理解了,perl的功能太强大了,这么几行就把问题解决了,就是用正则表达式有点难理解,而且这些方法不容易想到回复 2# sunzhiguolu


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP