免费注册 查看新帖 |

Chinaunix

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

怎么用perl删除匹配行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-20 11:20 |只看该作者 |倒序浏览
我需要对一个被实时访问的列表文件进行处理,删除里面符合匹配条件的行,想破了头都不知道怎么做,哪位给提个醒?

比如列表文件如此:
123,20060319091100,ABC,DEF
456,20060319093021,SDF,FGHG

这是一个用“,”分割的普通文本文件,其中第二列里面包含日期和时间信息,记录都是按时间增长的,就是说相当于按第二列排序了。我用perl要在里面找出3天前的行并删除这些匹配行,例如2006年3月20日执行时,从头检查第二列内容的前8位,如果小于20060317就删除该行,如果等于20060317了就推出操作,如何做啊?

还有这个文件是被其他程序实时访问的,因此我只能在此文件本身操作。

谢谢啦!

论坛徽章:
0
2 [报告]
发表于 2006-03-20 14:27 |只看该作者
你把 3 天前的时间计算出来,然后循环这个文件把所有 3 天后的行输出到另外一个文件里。然后把这个文件更名成旧的文件覆盖。
既然你说这个文件是实时的,那么可以尝试建个 cron job 到深夜时运行这个程序。更名很快,而且选择在很晚运行应该可以解决你的问题。

下面这段没完全解决你的问题,但如果你了解一点 Perl 就可以完成你想做的。鼓励你自己去学习吧。


  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use Time::Local;

  5. my ($d,$m,$y) = (localtime)[3,4,5];
  6. my $time = timelocal(0,0,0,$d,$m,$y+1900);
  7. $time = $time - 60*60*24*3 ;
  8. ($d,$m,$y) =  (localtime $time)[3,4,5];
  9. my $days_ago = sprintf("%04d%02d%02d",$y+1900,$m+1,$d--);
  10. # 今天是 20060320, $days_ago 是 3 天前。即 20060317

  11. while (<>) {
  12.    if ((split ",",$_)[1]=~ /^(\d{8})/) {
  13.        print unless $1 > $days_ago;
  14.    }
  15. }
复制代码


运行 perl time.pl  文件名试试。

## 这段程序没有测试....

另外, 用 Date::Calc 模块的 Add_Delta_Days 方法计算会更容易些。

[ 本帖最后由 Qiang 于 2006-3-20 01:33 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-03-20 14:34 |只看该作者
很难吧..除非你把他lock...才能作处理.....想办法转到DB去吧.....那会比较容易....

论坛徽章:
0
4 [报告]
发表于 2006-03-22 12:21 |只看该作者

回复 2楼 Qiang 的帖子

谢谢您的帮助!我最后还是采取的是一行行地读,如果是三天内的记录就写到临时文件,然后拷贝回来就是了,只是这个文件有好几千行,访问冲突的几率还是存在的。您的代码很有借鉴作用,split那行就是删除匹配行吧?刚开始学,对正则表达式还十分生疏。

论坛徽章:
0
5 [报告]
发表于 2006-03-22 14:13 |只看该作者
删除比太好作,不过用空行代替可行吗?

给你个例子


#!/usr/bin/perl -w

@ARGV = glob "urfile" or die "no file found";
$^I = "";
while (<>) {
s/ur_pattern//;
print;

}

补充一句,这个是在原始文件上更改,不用临时文件的

[ 本帖最后由 superdoctor 于 2006-3-22 14:14 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP