grep -v -f 替代方案

grep -v -f 替代方案

我有两个文件。我想从文件 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+ 的任何内容,这始终会导致“被杀死”。

/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标志。这里不需要catgrep可以与文件参数一起使用。

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


您可以分成file2几个N部分,grep在每个部分上运行并将结果用作下次运行的输入文件:

# 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根据需要进行调整。

相关内容