我想知道 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 file2
比grep -vf
grep -vFf file1 file2
file1
大文件没有问题grep -vf file1 file2
随着文件大小的增加而受到严重影响file1
(这仅在大小 > 500 行或 > 4kbytes 时可见)
答案2
是的,会没事的。最坏的情况是,包含要排除的字符串的文件等于正在处理的文件的大小,并且大小不适合内存。如果遇到这种情况,请将排除文件拆分为多个块并运行多次。