比较两个文本文件

时间:2015-02-19 12:28:45

标签: perl list file

我是Perl的新手。我有两个文本文件,我需要检查两个列表上的匹配字符串。

例如匹配字符串是:

line - file 1: fe/bla/blablabla/abcdefg

line - file 2: blablabla/abcdefg

有一场比赛!

此外,匹配字符串的位置(行号)在两个文件上都不相同。

我尝试将列表放在数组中并将数组与嵌套循环进行比较,但程序的运行时间很长(列表包含数千行),我相信还有另一种方式,不那么天真,更有效率。

这是我将数据放入数组的方式:

my $list1 = /path/to/the/file;

open (FILE , '<' , $list1) or die ("Could not open the file");
while ( my $line = <FILE> ) {
  chomp ($line);
  $list_1[$i] = $line;
  $i = $i+1;
}
close FILE;

我也把它放到了另一个列表中。

这是我的嵌套循环。

for ( $k = 0 ; $k < @list_1 ; $k = $k+1 ) {
  for ($i = 0 ; $i < @list_2 ; $i = $i+1 ) {
    if (index($list_1[$k] , $list_2[$i]) != -1) {
      splice (@list_2 , $i , 1);
      last;
    }
  } 
}

1 个答案:

答案 0 :(得分:2)

只要file2不是很大,最简单的方法是从其内容构建正则表达式模式,并根据模式检查file1中的每一行。

您没有说出您想要的输出,因此我打印了file1file2匹配的所有行。

use strict;
use warnings;
use 5.010;
use autodie;

my ($list1, $list2) = qw( /path/to/list1 /path/to/list2 );

open my $fh, '<', $list2;
my $re = join '|', map { chomp; quotemeta; } <$fh>;
$re = qr/$re/;

open $fh, '<', $list2;
while ( <$fh> ) {
  print if /$re/;
}