如何从两个文本文件中获取互补行?
文件file1.txt
有
123 foo
234 bar
...
文件file2.txt
有
123 foo
333 foobar
234 bar
...
我想把所有的线都放进去file1.txt
而不是file2.txt
. 这两个文件有数百 MB 大,并且包含非 ASCII 字符。有什么快速的方法来做到这一点?
如何从两个文本文件中获取互补行?
文件file1.txt
有
123 foo
234 bar
...
文件file2.txt
有
123 foo
333 foobar
234 bar
...
我想把所有的线都放进去file1.txt
而不是file2.txt
. 这两个文件有数百 MB 大,并且包含非 ASCII 字符。有什么快速的方法来做到这一点?
为了获得大文件的良好性能,不要将大量文件读入内存;尽可能使用磁盘上的内容。
字符串匹配可以通过散列有效地完成。
一种策略:
djb2
是一个例子,但有很多。“数百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
线,具体?
fgrep -vxf file2.txt file1.txt