我有~15万行文件。我有另一个大约500,000行的文件。我想保留大文件中的行,其中特定字段与第二个文件中的行匹配。大文件是制表符分隔的。
例如,你会如何在Perl中执行此操作?
答案 0 :(得分: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);
}
}
如果您确信您的数据不包含嵌入的标签,那么您可能只需在标签上拆分该行,而不是使用Text :: CSV_XS:
while (<$bigfile>) {
chomp;
my @row = split /\t/;
if (defined $lookup{$row[0]}) {
print "$_\n";
}
}
答案 1 :(得分:3)
我填充了键入第二个文件中值的哈希值。将值设置为1
。
然后我做一个简单的while(<FILE>)
循环,在关键字段的散列中进行查找。如果哈希中有条目,则打印该行。继续前进。
Perl的哈希查找非常快,做了1500万次应该没问题。