如何从两个文本文件中获取补充行?

时间:2012-06-26 04:05:17

标签: regex text comparison diff complement

如何从两个文本文件中获取互补线?

档案file1.txt

123 foo
234 bar
...

档案file2.txt

123 foo
333 foobar
234 bar
...

我希望获得file1.txt中的所有行,而不是file2.txt中的所有行。这两个文件大小为数百MB,包含非ASCII字符。什么是快速的方法呢?

3 个答案:

答案 0 :(得分:2)

为了获得大文件的良好性能,请不要将大部分文件读入内存;尽可能地使用磁盘上的内容。

可以使用散列有效地完成字符串匹配。

一个策略:

  1. 逐行扫描第一个文件。对于每一行:
    • 为该行散列字符串。您使用的散列算法很重要; djb2就是一个例子,但有许多例子。
    • 将密钥放入哈希集结构中。不要保留字符串数据。
  2. 逐行扫描第二个文件。对于每一行:
    • 为该行散列字符串。
    • 如果在第一个文件的集合中找不到哈希键:
      • 将此行的字符串数据写入您跟踪不同行的输出(例如标准输出或其他文件)。哈希值不匹配,因此该行显示在第二个文件中,但不显示在第一个文件中。

答案 1 :(得分:1)

“数百MB”并非如此。

我会这样解决这个问题(在Perl中):

$ cat complementary.pl 
my %f;

open(F, "$ARGV[1]") or die "Can't open file2: $ARGV[1]\n";
$f[$_] = 1 while(<F>);
close(F);

open(F, "$ARGV[0]") or die "Can't open file1: $ARGV[0]\n";
while(<F>) {
    print if not defined $f[$_];
}

使用示例:

$ cat file1.txt 
100 a
200 b
300 c

$ cat file2.txt 
200 b
100 a
400 d

$ perl complementary.pl file1.txt file2.txt 
300 c

答案 2 :(得分:1)

行,特别是?

fgrep -vxf file2.txt file1.txt