我有一个非常大的文件大小约300-500 MB。我需要先在该文件中搜索String1。然后从String1的位置开始搜索String2。然后再从String2的位置开始搜索String3。例如,
String1 = "abc"
String2 = "123"
String3 = "opq"
档案:
def
123
opq
opq
123
opq
abc //come here first
blah blah
123 //come here next
blah
opq //read this finally and print
afg
123
blah blah
123
def
我遵循的方法,
我尝试逐行读取文件并搜索匹配模式。
这是一种非常缓慢的方法(必须等待几分钟)。
然后我将整个文件存储到一个数组中并使用匹配的行来获取最后一行。
搜索速度非常快,但将文件加载到数组中速度较慢。消耗的内存也很高。
有没有一种有效的方法来执行这样的任务?
答案 0 :(得分:2)
使用perl one liner和range操作符:
perl -ne 'print("$. $_") && exit if (/abc/ .. 1) && (/123/ .. 1) && /opq/' file
输出:
11 opq //read this finally and print
切换:
-n
:为输入文件中的每一行创建一个while(<>){..}
循环。 -e
:告诉perl
在命令行上执行代码。 <强>代码强>:
print("$. $_")
:打印行号$.
,后跟当前行$_
exit
:在找到所需的行后终止处理。if (/abc/ .. 1) && (/123/ .. 1) && /opq/
:按顺序查找模式。 我建议不要反对另一个perl进程来实现此功能。而只是将其转换为非命令行版本:
use strict;
use warnings;
use autodie;
open my $fh, '<', 'file';
while (<$fh>) {
if ((/abc/ .. 1) && (/123/ .. 1) && /opq/) {
print "$. $_";
last;
}
}