0

2つのテキストファイルから補完行を取得するにはどうすればよいですか?

ファイルfile1.txtには

123 foo
234 bar
...

ファイルfile2.txtには

123 foo
333 foobar
234 bar
...

file1.txtにではなく、すべての行を入れたいfile2.txt。2つのファイルは数百MBの大きさで、非ASCII文字が含まれています。これを行うための高速な方法は何ですか?

4

3 に答える 3

2

大きなファイルで良好なパフォーマンスを得るには、ファイルの多くをメモリに読み込まないでください。可能な限りディスク上にあるものを操作します。

文字列照合は、ハッシュを使用して効率的に実行できます。

1つの戦略:

  1. 最初のファイルを1行ずつスキャンします。各行について:
    • 行の文字列をハッシュします。使用するハッシュアルゴリズムは重要です。djb2一例ですが、たくさんあります。
    • キーをハッシュセット構造に入れます。文字列データを保持しないでください。
  2. 2番目のファイルを1行ずつスキャンします。各行について:
    • 行の文字列をハッシュします。
    • 最初のファイルのセットにハッシュキーが見つからない場合:
      • この行の文字列データを、さまざまな行を追跡している出力(標準出力や別のファイルなど)に書き込みます。ハッシュが一致しなかったため、この行は2番目のファイルに表示されますが、1番目のファイルには表示されません。
于 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 に答える