在perl中有效地检查文件的哪些行不在另一个文件中

时间:2016-08-23 22:08:57

标签: perl variables

我想将一个文件与另一个文件进行比较,找出输入文件中找到的行,但找不到与之比较的文件

这是我的剧本

#!/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

而且只有我看到的线条数量才能有效地完成这段时间

我基本上希望脚本能够执行它现在所做的工作,但在更大规模上使用时涉及的流程更少

感谢 - 你!

1 个答案:

答案 0 :(得分:1)

使用哈希而不是数组。如果file.txt非常大,请对较小的输入文件进行哈希处理。您可以使用重要输入字段的串联作为键,将其余字段作为值使用,或者使用散列哈希值将每个重要字段作为另一个级别的键,并将剩余值作为值(作为字符串或数组)。

$hash{$name}{$start}{$stop}{$num} = [ $spot, $sStart, $sStop, $id ];