删除包含字符串的行(另一个文本文件中列出的字符串)的最快且最有效的方法

删除包含字符串的行(另一个文本文件中列出的字符串)的最快且最有效的方法

我想知道 fgrep 是否是从文件(file1)中删除包含在另一个文件(file2)中找到的字符串的行的最快且最有效的方法。

我发现函数 fgrep 应该按如下方式执行此操作:

  fgrep -v -f file1  file2  > file_with_lines_containing_search_strings_removed

我不知道这是否适用于非常大的文件。

我有两个包含 100,000 行的文件,我想使用尽可能最快的方法。

谢谢。

祝所有那些长相滑稽的美国人 7 月 4 日快乐。

答案1

如果您想要“包含在另一个文件中找到的字符串的行”(而不是“包含与另一个文件中的 regExp 匹配的字符串的行”),请尝试:

grep -vFf file1 file2 > file3

“grep -F”不是寻找正则表达式匹配而是简单的字符串匹配(快多了

甚至更好

grep -vwFf file1 file2                 #respect word boundary

只是一个快速的时间比较测试:

1) 构建一个 100 000 行随机行示例文件2

seq 1000000 | shuf -n 100000 > file2

2) 构建一个 10 000 行随机行示例 file1(要删除的字符串)

 seq 1000000 | shuf -n 10000 > file1

31) 使用grep -F ---time grep -vwFf file1 file2 > file31

real    0m0.111s
user    0m0.100s
sys 0m0.008s

32) 没有-F——time grep -vwf file1 file2 > file32

... 小时!

if file1 has just 300 lines --    0.327s          very fast
....              600 lines --    8.326s
....              900 lines --   35.334s
....             1200 lines -- 1m31.433s      (quadratic with file1 len?)

....            10000 lines -- it is still calculating (several hours?)
UPDATED                     1h03m53.983s

测试结论:

  • grep -vFf file1 file2grep -vf

  • grep -vFf file1 file2file1大文件没有问题

  • grep -vf file1 file2随着文件大小的增加而受到严重影响file1(这仅在大小 > 500 行或 > 4kbytes 时可见)

答案2

是的,会没事的。最坏的情况是,包含要排除的字符串的文件等于正在处理的文件的大小,并且大小不适合内存。如果遇到这种情况,请将排除文件拆分为多个块并运行多次。

相关内容