jef*_*f b 3 perl search large-files
我有~15万行文件.我有另一个大约500,000行的文件.我想保留大文件中的行,其中特定字段与第二个文件中的行匹配.大文件是制表符分隔的.
例如,你会如何在Perl中做到这一点?
您可能会从使用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)