以perl中最快的方式跳转到文件中的行

时间:2014-07-07 06:51:18

标签: perl file-io performance processing-efficiency

我有一个非常大的文件大小约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

我遵循的方法,

  1. 我尝试逐行读取文件并搜索匹配模式。

    这是一种非常缓慢的方法(必须等待几分钟)。

  2. 然后我将整个文件存储到一个数组中并使用匹配的行来获取最后一行。

    搜索速度非常快,但将文件加载到数组中速度较慢。消耗的内存也很高。

  3. 有没有一种有效的方法来执行这样的任务?

1 个答案:

答案 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;
    }
}