grep -v -f 代替

grep -v -f 代替

2つのファイルがあります。ファイル1からファイル2のすべての内容を除外したいです。

例)

ファイル#1 - 500のドメイン名のリスト

domain1
domain2
domain3
etc..

ファイル#2 - Alexaの上位1,000,000ドメイン

domain1
domain2
domain3
etc..

私はこれがうまくいくと思います。

cat file1 | grep -v -f file2 > results

これは file2 で 10k+ を超えるすべてのものに対して常に "killed" をもたらします。

/var/log/messagesメモリが不足していると表示されます。ボックスには12GBのRAMがあります。

Aug 25 02:21:18 V-RHEL-EM kernel: Out of memory: Kill process 13779 (grep) score 860 or sacrifice child
Aug 25 02:21:18 V-RHEL-EM kernel: Killed process 13779 (grep), UID 0, total-vm:9377064kB, anon-rss:7400368kB, file-rss:0kB, shmem-rss:0kB

もっと良い方法がありますか?

ベストアンサー1

固定文字列を使用しているため、対応するフラグを追加し、行-F全体を一致させるには、その-xフラグを追加します。ここでは必要ではなく、catファイルgrepパラメータと一緒に使用できます。

grep -F -x -v -f file2 file1 > results


file2複数の部分に分割しNgrep各部分で実行し、結果を次の実行のための入力ファイルとして使用できます。

# split file2 into N=4 parts file2.00 file2.01 file2.02 file2.03
split -nl/4 -d file2 file2.

# use results as input file
cp file1 results

for f2 in file2.??; do
        grep -F -x -v -f "$f2" results > rtemp && mv rtemp results
done

# cleanup
rm file2.??

N=4必要に応じて調整してください。

おすすめ記事