【发布时间】:2015-08-31 20:45:00
【问题描述】:
我(显然)是 Perl 新手,我正在尝试创建一个简单的脚本来每周清理大约 450 万条记录的大文件。我想完全删除与三种模式之一匹配的行。该文件如下所示:
D0832
G2565
ZDS97
FHM2547
JDH1464
R2918
4918K
AG01023
AG02997
我的下面的脚本有效,但是我在发生删除(替换)的地方得到一个空白行,而不是完全删除该行。
#!/usr/bin/perl
open( FH, "serial.txt" ) || die "Couldn't open file...\n";
while ( <FH> ) {
$data .= $_;
}
$data =~ s/[A][F|G][(0-9)]{5}//g;
$data =~ s/[A-Z][0-9][0-9][0-9][0-9]//g;
$data =~ s/[0-9][0-9][0-9][0-9][A-Z]//g;
print $data;
close( FH );
我的问题是 - 有 450 万条记录,每周至少运行一次,这是一种高效/快速的方式来完成我想做的事情,还是有更有效的方式来做到这一点?另外,我怎样才能删除这些行而不是替换一个空行?
谢谢大家。斯蒂芬
【问题讨论】:
-
关于如何删除这些行 - 在查找正则表达式的末尾包含
\n。关于它是否足够快 - 它肯定会在一周的时间内通过,但你必须测试它是否让自己满意:) -
[(0-9)]也匹配(和)。同样,[F|G]也匹配|。 -
你有没有考虑过完全不使用 perl 来解决这个问题。我认为
grep -v 'regexp'会做得更好。请参阅 grep(1) 实用程序手册页中的选项-v。 Grep 擅长过滤文本行。它是在考虑到该目标的情况下开发的。并且至少比 perl 大十岁。