あるファイル(3.2Gb)のパターンが別のファイル(4.8Gb)と一致するgrep

あるファイル(3.2Gb)のパターンが別のファイル(4.8Gb)と一致するgrep

2つのテキストファイルがあります。 1つは、名前、電子メールアドレス、およびその他のフィールドを含むテキストファイルです。一部の行は以下で提供されますfile1

John:[email protected]:johnson123:22hey
Erik:[email protected]:johnson133:22hey
Robert:[email protected]:johnson123:21hey
Johnnny:[email protected]:johnson123:22hey

もう一方にはメールアドレスのみが含まれています。次の例file2:

[email protected]
[email protected]
[email protected]
[email protected]

file1私はすべての行に電子メールアドレスを持つ出力が欲しいですfile2。たとえば[email protected]is infile2なので、ここで次の行を見たいと思いますfile1

John:[email protected]:johnson123:22hey

file1「Eメールアドレス一覧」に一致する行を検索して出力する簡単な方法はありますかfile2

私は何時間も検索してきましたが、これまでGoogle検索(およびStackOverflow検索)とコマンドラインの努力は成果がありませんでした。

私が試した結果、動作するコマンドは次のとおりです。

fgrep -f file2.txt file1.txt > matched.txt
grep -F -f ....
grep -F -x -f file1 file2 > common 

ちょっと待って、しかし両方を見つけましたgrep memory exhausted。私が一致するファイルは4.8 GB(file1)と3.2 GB(file2Eメールアドレスのみを含む)でした。私の考えでは、このコマンドはメモリを使い果たすと思います。コマンドをよりスムーズに実行する方法を見つけましたfindが、うまくいきませんでした。

概要;一致項目が必要ですfile2file1行の 1 つがfile2の行と一致するとfile1出力します。ファイルが大きいため、すべてのメモリを使用しない安全な方法が必要です。

ありがとうございます。一日中これを探して実験し、あきらめたくなかった(5時間以上)。

ベストアンサー1

大容量ファイルを操作するのは非常に困難ですが、次の3つの手順で処理できます。

  1. タイプファイル12番目のフィールドをタップ

    sort -k2,2 -t: file1 >file1.sorted
    
  2. タイプファイル2

    sort file2 >file2.sorted
    
  3. 電子メールフィールドを介して2つのファイルを結合する

    join -t: -2 2 file2.sorted file1.sorted -o 2.1,0,2.3,2.4 >matched.txt
    

おすすめ記事