免费注册 查看新帖 |

Chinaunix

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

perl匹配字符串后读取后面的文件 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-10 10:19 |只看该作者 |倒序浏览
我有一个文件,格式如下:

.......................
2015-7-6 15:28:15  CHI75156491GJBN13231000521
2015-7-6 15:30:06  BS7546152075123456789A
2015-7-6 15:30:08  CAB7537152075546115654526
.......................
2015-7-6 15:30:16  CAB75461520753659K784421
.......................
2015-7-6 15:31:20  BS7538152075123456789B4
.......................
2015-7-6 15:31:31  CS7538152075354253442B8752
.......................

符号"........"是代表中间有很多类似的行

我想实现打印出包含字符串"75(\d{6})75123456789"的行和包含$1的行并保存到result文件中,上面部分内容的结果为:
2015-7-6 15:30:06  BS7546152075123456789A
2015-7-6 15:30:16  CAB75461520753659K784421
2015-7-6 15:31:20  BS7538152075123456789B4
2015-7-6 15:31:31  CS7538152075354253442B8752

程序如下:
use strict;
open(MYFILE,"E:/log1.txt") or die("Can't open log1.txt");
open(OUTFILE,">E:/result.txt") or die("Can't open result.txt");
# $/ = undef;
my @b = <MYFILE>;
my $count1 = 0;
my $count2 = 0;
my ($b, $c);
foreach $b (@b){
   if($b =~ /75(\d{6})75123456789/){
       $a = $1;
       $count1++;
       foreach $c (@b){
           if($c =~ /75($a)75/){
               $count2++;
               print OUTFILE "$a\n";
               print OUTFILE "$b\n";
               print OUTFILE "$c\n";
           }
       }
    }
}
print "$count1\n";
print "$count2\n";
close MYFILE;
close OUTFILE;

但是,我发现这样我第二次读取文件也是读取了整个文件,而不是读取第一次匹配之后的行,因为文件中第一次匹配的行前面的行也可能包含有$1,这就把前面的行也打印出来了,我现在只想打印第一次匹配之后包含 $1 的行,这该如何实现呢?

论坛徽章:
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
2 [报告]
发表于 2015-07-10 10:37 |只看该作者
本帖最后由 jason680 于 2015-07-10 10:46 编辑

回复 1# yilongyansha

how about this ...

$ perl get_75.pl FILE
2015-7-6 15:30:06  BS7546152075123456789A
2015-7-6 15:30:16  CAB75461520753659K784421
2015-7-6 15:31:20  BS7538152075123456789B4
2015-7-6 15:31:31  CS7538152075354253442B8752

$ cat get_75.pl
use strict;
use warnings;

my $sKey = "";
while(<>){
  if(m/(75\d{6}75)123456789/){
    $sKey = $1;
  }
  next if($sKey eq "");
  if(m/$sKey/){
    print "$_";
  }
}

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
3 [报告]
发表于 2015-07-10 10:59 |只看该作者
回复 2# jason680


next if($sKey eq "");   #这一句是什么意思啊,跳出这一次的循环吗?

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
4 [报告]
发表于 2015-07-10 11:17 |只看该作者
回复 2# jason680

不行啊,没有输出


   

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
5 [报告]
发表于 2015-07-10 17:18 |只看该作者
要下班了,来不及弄全部
if($b =~ /75(\d{6})75123456789/){
中间加上这句
       push @c, $b; #如果匹配上了,把这行放到一个新的数组c里面

后面的循环 foreach $c (@b) 就把@b换成@c试试

另外,你上个帖子里面我给你这句话了,建议你先自己试试,否则很难提高的

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-07-08 22:20:00
6 [报告]
发表于 2015-07-10 17:54 |只看该作者
回复 5# xiaoxingan99



foreach $c (@c); #这一句是在$b =~ /75(\d{6})75123456789/ 的行里匹配吧,$c =~ /75($a)75/匹配出来的都是$b,其他含有$1的行好像不能匹配


   

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
7 [报告]
发表于 2015-07-11 10:19 |只看该作者
回复 6# yilongyansha


    不知道是不是理解能力变差了,好像听不懂你的问题

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
8 [报告]
发表于 2015-07-11 15:07 |只看该作者
回复 6# yilongyansha
建议你先自己试试
我给你这code
确保 $1 match 它是 1 or 2

1: /^\S+\s+\S+\s+[A-Z]+\d+75${SIX_DIGITS}75/
2: /^\S+\s+\S+\s+[A-Z]+75${SIX_DIGITS}75/



   

论坛徽章:
0
9 [报告]
发表于 2015-08-13 20:25 |只看该作者
回复 2# jason680
如果参数的数据顺序打乱了就不行了哇~~


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP