bash – 在大型数据集上使用grep或fgrep进行非常慢的循环

我正在尝试做一些非常简单的事情;来自列表的grep,对于字符串的完全匹配,对目录中的文件
#try grep each line from the files
for i in $(cat /data/datafile); do 
LOOK=$(echo $i);
fgrep -r $LOOK /data/filestosearch >>/data/output.txt
done

与grep匹配的文件有2000万行,目录有~600个文件,共有~40万行
我可以看到这将是缓慢但我们估计需要7年.即使我在HPC上使用300个内核按文件分割作业进行搜索,看起来可能需要一周时间.

有类似的问题:

Loop Running VERY Slow

Very slow foreach loop

虽然它们位于不同的平台上,但我想可能还有其他可能对我有所帮助.
或fgrep可能更快(但我现在正在测试它似乎有点慢)
任何人都可以看到更快的方法吗?
先感谢您

听起来像grep的-f标志在这里是合适的:
-f FILE,--file=FILE
    Obtain  patterns  from  FILE,one  per  line.   The  empty file
    contains zero patterns,and therefore matches nothing.   (-f  is
    specified by POSIX.)

所以grep已经可以做你的循环正在做的事情了,你可以用以下代码替换循环:

grep -F -r -f /data/datafile /data/filestosearch >>/data/output.txt

现在我不确定2000万个模式的性能,但至少你没有以这种方式启动2000万个进程,所以它可能要快得多.

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...