如何从两个文本文件中获取互补行?
文件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