0

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

文件file1.txt

123 foo
234 bar
...

文件file2.txt

123 foo
333 foobar
234 bar
...

我想把所有的线都放进去file1.txt而不是file2.txt. 这两个文件有数百 MB 大,并且包含非 ASCII 字符。有什么快速的方法来做到这一点?

4

3 回答 3

2

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

字符串匹配可以通过散列有效地完成。

一种策略:

  1. 逐行扫描第一个文件。对于每一行:
    • 散列该行的字符串。您使用的哈希算法很重要;djb2是一个例子,但有很多。
    • 将密钥放入哈希集结构中。不要保留字符串数据。
  2. 逐行扫描第二个文件。对于每一行:
    • 散列该行的字符串。
    • 如果在第一个文件的集合中找不到哈希键:
      • 将此行的字符串数据写入您正在跟踪不同行的输出(例如标准输出或另一个文件)。哈希不匹配,因此该行出现在第二个文件中,但不在第一个文件中。
于 2012-06-26T05:01:47.153 回答
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
于 2012-06-26T04:19:12.523 回答
1

线,具体?

fgrep -vxf file2.txt file1.txt
于 2012-06-26T04:21:53.587 回答