2つのテキストファイルから補完行を取得するにはどうすればよいですか?
ファイルfile1.txt
には
123 foo
234 bar
...
ファイルfile2.txt
には
123 foo
333 foobar
234 bar
...
file1.txt
にではなく、すべての行を入れたいfile2.txt
。2つのファイルは数百MBの大きさで、非ASCII文字が含まれています。これを行うための高速な方法は何ですか?
2つのテキストファイルから補完行を取得するにはどうすればよいですか?
ファイルfile1.txt
には
123 foo
234 bar
...
ファイルfile2.txt
には
123 foo
333 foobar
234 bar
...
file1.txt
にではなく、すべての行を入れたいfile2.txt
。2つのファイルは数百MBの大きさで、非ASCII文字が含まれています。これを行うための高速な方法は何ですか?
大きなファイルで良好なパフォーマンスを得るには、ファイルの多くをメモリに読み込まないでください。可能な限りディスク上にあるものを操作します。
文字列照合は、ハッシュを使用して効率的に実行できます。
1つの戦略:
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