首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除包含字符串(另一个文本文件中列出的字符串)的行的最快和最有效的方法

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

Unix & Linux用户
提问于 2017-07-05 02:13:29
回答 2查看 1.1K关注 0票数 3

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

我发现fgrep函数应该这样做:

代码语言:javascript
复制
  fgrep -v -f file1  file2  > file_with_lines_containing_search_strings_removed

我不知道这对非常大的文件是否有效。

我有两个100,000行的文件,我想使用最快的方法。

谢谢。

祝所有看上去滑稽的美国人7月4日快乐。

EN

回答 2

Unix & Linux用户

发布于 2017-07-05 08:48:44

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

代码语言:javascript
复制
grep -vFf file1 file2 > file3

"grep -F“不是寻找regexp匹配,而是寻找简单的字符串匹配(更快)。

甚至更好

代码语言:javascript
复制
grep -vwFf file1 file2                 #respect word boundary

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

1)构建一个10万个随机行(例如file2 )

代码语言:javascript
复制
seq 1000000 | shuf -n 100000 > file2

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

代码语言:javascript
复制
 seq 1000000 | shuf -n 10000 > file1

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

代码语言:javascript
复制
real    0m0.111s
user    0m0.100s
sys 0m0.008s

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

..。几个小时!

代码语言:javascript
复制
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 file2在大file1文件方面没有问题
  • grep -vf file1 file2file1文件大小的增加而受到邪恶的影响(仅在大于500行或>4K字节时才可见)
票数 2
EN

Unix & Linux用户

发布于 2017-07-05 03:03:01

是的会没事的。最糟糕的情况是,具有要排除的字符串的文件等于正在处理的文件的大小,并且大小不适合内存。如果有这种情况,那么将排除文件分割成块并运行多个传递。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/375351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档