2017-03-09 17 views
3

file.txtファイルに格納されているパターンを使用してdata.txtからフィルタデータを取得しようとしています。grep -vfが大きいファイルでは遅すぎる

grep -v -f filter.txt data.txt > op.txt 

、以下のようにこれはgrepはdata.txtをでfilter.txtで30-40K線や〜300Kラインのためのより多く10〜15分かかります。

これをスピードアップする方法はありますか?

data2 
data3 

op.txt

data.txtを

data1 
data2 
data3 

filter.txt

data1 

これはcodeforesterが提供するソリューションで動作しますが、filter.txtが空の場合に失敗します。

+3

ファイルの両方からのサンプル行を含めてください。あなたはこの問題について広範な議論をしているこの記事を見てみたいかもしれません:http://stackoverflow.com/questions/42239179/fastest-way-to-find-lines-of-a-text-file-from-別のより大きいテキストファイル内のファイル – codeforester

+0

リンクありがとう。類似の問題に関する良い議論。 awk 'FNR == NR {hash [$ 1];次の} $ 2のハッシュ 'file1.txt FS =' | ' file2.txtは行のマッチングには使用できますが、反転した結果が必要です。どのようにそれを反転一致のために働かせるか分からない。 – user3150037

答えて

4

relatedポストでInian'sソリューションに基づいて、このawkコマンドはあなたの問題を解決する必要があります。

awk 'FNR==NR {hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt 
+0

それを見つけた 。ありがとう:) – user3150037

+0

このコマンドは、filter.txtが空であれば空のop.txtファイルを返しますが、data.txtには行があります。理想的な場合、それはdata.txtからすべてのレコードを返す必要があります – user3150037

+0

私のために正しく動作します。あなたのファイルに先行/後続スペースがありますか? – codeforester

関連する問題