我想将一个文件与另一个文件进行比较,找出输入文件中找到的行,但找不到与之比较的文件
这是我的剧本
#!/usr/bin/perl
my $data_file = "file.txt";
my @data;
{
open my $fh, "<", $data_file or die qq{Unable to open "$data_file" for input: $1};
while ( <$fh> ) {
next unless /\S/;
push @data, [ split ];
}
}
my $found;
while ( <> ) {
$found=0;
my ($num, $spot, $sStart, $sStop, $name, $id, $start, $stop) = split;
for $item ( @data ) {
($uNum, $uSpotStart, $uSpotStop, $uSpot, $udontUse, $uStart, $uStop, $uName) = @$item;
if ( $uName eq $name and $start == $uStart and $stop == $uStop and $uNum eq $num ) {
$found=1;
last;
}
}
if ($found==0){
print $_;
}
}
该脚本有效,但问题是它永远无法完成编译,因为file.txt包含大约200,000行,输入文件包含大约20,000行
这是file.txt
中的一个例子1 1729 1858 25 g 6600 6700 Sam
15 9302 9030 12 t 3900 4500 Frodo
19 0 2000 13 y 3300 3800 Merry
20 0 510 13 h 6300 6500 Pippin
虽然这将是程序的输入文件
1 25 1600 1700 Sam 40 6600 6700
15 11 1500 2000 Frodo 67 3900 4500
15 11 1500 2000 Frodo 67 3800 4500
17 10 3000 3100 Bilbo 50 2300 2600
19 20 3400 3700 Merry 39 3300 3800
20 90 3900 4200 Pippin 80 6300 6500
这应该是输出
15 11 1500 2000 Frodo 67 3800 4500
17 10 3000 3100 Bilbo 50 2300 2600
而且只有我看到的线条数量才能有效地完成这段时间
我基本上希望脚本能够执行它现在所做的工作,但在更大规模上使用时涉及的流程更少
感谢 - 你!
答案 0 :(得分:1)
使用哈希而不是数组。如果file.txt
非常大,请对较小的输入文件进行哈希处理。您可以使用重要输入字段的串联作为键,将其余字段作为值使用,或者使用散列哈希值将每个重要字段作为另一个级别的键,并将剩余值作为值(作为字符串或数组)。
$hash{$name}{$start}{$stop}{$num} = [ $spot, $sStart, $sStop, $id ];