Grep 无法处理那么多查询,而且在那个量下,修复使它如此缓慢的grep -f
错误也无济于事。
file1 和 file2 是否都由每行一个单词组成?这意味着您正在寻找完全匹配的内容,我们可以通过以下方式快速完成awk
:
awk 'NR == FNR { query[$0] = 1; next } query[$0]' file1 file2
NR(记录数,行号)仅等于第一个文件的 FNR(文件特定记录数),我们在其中填充哈希,然后移至下一行。第二个子句检查其他文件的行是否与保存在我们哈希中的行匹配,然后打印匹配的行。
否则,您将需要迭代:
awk 'NR == FNR { query[$0]=1; next }
{ for (q in query) if (index($0, q)) { print; next } }' file1 file2
我们不仅要检查散列,还必须遍历每个查询,看看它是否与当前行匹配($0
)。这要慢得多,但不幸的是这是必要的(尽管我们至少在不使用正则表达式的情况下匹配纯字符串,所以它可能会更慢)。当我们有匹配时,循环停止。
如果您真的想将查询文件的行作为正则表达式进行评估,您可以使用$0 ~ q
更快的index($0, q)
. 请注意,这使用了POSIX 扩展的正则表达式,与或没有有界量词( ) 或单词边界的GNU 扩展( ) 和速记字符类( ,等)大致相同grep -E
或egrep
没有。{1,7}
\b
\s
\w
只要哈希不超过awk
可以存储的内容,这些应该可以工作。这可能低至 2.1B 条目(基于最高 32 位有符号整数的猜测)或与您的可用内存一样高。