最有效的方法是将非常大的文本文件和输出行匹配到任何一个非常大的术语到另一个文件

jef*_*f b 3 perl search large-files

我有~15万行文件.我有另一个大约500,000行的文件.我想保留大文件中的行,其中特定字段与第二个文件中的行匹配.大文件是制表符分隔的.

例如,你会如何在Perl中做到这一点?

TLP*_*TLP 5

您可能会从使用csv模块解析大文件中的数据中受益.它也可能是矫枉过正,而且比你的价值更麻烦,你必须自己判断.请注意,下面使用的Text :: CSV_XS可能会更改您的数据以符合csv标准,并且有许多选项可以调整输出的外观.

这是一个可以帮助您入门的基本脚本.

use strict;
use warnings;
use autodie;
use Text::CSV_XS;

open my $lookup, '<', "lookupfile";
my %lookup;
while (<$lookup>) {
    next if /^\s*$/;   # remove empty lines
    chomp;             # remove newline
    $lookup{$_} = 1;
}
close $lookup;

my $csv = Text::CSV_XS->new ({
    binary    => 1, 
    eol       => $/,
    sep_char  => "\t",
});
open my $bigfile, '<', 'bigfile';
while (my $row = $csv->getline ($bigfile)) {
    if (defined ($lookup{$row->[0]})) {
        $csv->print(\*STDOUT, $row);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您确信您的数据不包含嵌入的选项卡,那么您可能只需在选项卡上拆分该行,而不是使用Text :: CSV_XS:

while (<$bigfile>) {
    chomp;
    my @row = split /\t/;
    if (defined $lookup{$row[0]}) {
        print "$_\n";
    }
}
Run Code Online (Sandbox Code Playgroud)