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(file2
Eメールアドレスのみを含む)でした。私の考えでは、このコマンドはメモリを使い果たすと思います。コマンドをよりスムーズに実行する方法を見つけましたfind
が、うまくいきませんでした。
概要;一致項目が必要ですfile2
。file1
行の 1 つがfile2
の行と一致するとfile1
出力します。ファイルが大きいため、すべてのメモリを使用しない安全な方法が必要です。
ありがとうございます。一日中これを探して実験し、あきらめたくなかった(5時間以上)。
ベストアンサー1
大容量ファイルを操作するのは非常に困難ですが、次の3つの手順で処理できます。
タイプファイル12番目のフィールドをタップ
sort -k2,2 -t: file1 >file1.sorted
タイプファイル2
sort file2 >file2.sorted
電子メールフィールドを介して2つのファイルを結合する
join -t: -2 2 file2.sorted file1.sorted -o 2.1,0,2.3,2.4 >matched.txt