【问题标题】:grep -vf too slow with large filesgrep -vf 对于大文件太慢
【发布时间】:2017-07-30 20:32:55
【问题描述】:

我正在尝试使用存储在文件 filter.txt 中的模式过滤 data.txt 中的数据。如下所示,

grep -v -f filter.txt data.txt > op.txt

对于 filter.txt 中的 30-40K 行和 data.txt 中的约 300K 行,此 grep 需要超过 10-15 分钟。

有什么办法可以加快速度?

数据.txt

data1
data2
data3

filter.txt

data1

op.txt

data2
data3

这适用于 codeforester 提供的解决方案,但当 filter.txt 为空时会失败。

【问题讨论】:

  • 请包含两个文件中的示例行。你可能想看看这篇对这个问题有广泛讨论的帖子:stackoverflow.com/questions/42239179/…
  • 感谢您的链接。关于类似问题的良好讨论。 awk 'FNR==NR{哈希[$1]; next}$2 in hash' file1.txt FS='|' file2.txt 适用于匹配行但需要反转结果。不知道如何使它适用于反转匹配。

标签: bash performance shell awk grep


【解决方案1】:

基于related 帖子中的Inian's 解决方案,此awk 命令应该可以解决您的问题:

awk 'FNR==NR {hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt

【讨论】:

  • 是的。找到了 。谢谢:)
  • 如果 filter.txt 为空,但 data.txt 有行,此命令将返回空的 op.txt 文件。在理想情况下,它应该返回 data.txt 中的所有记录
  • 对我来说可以正常工作。您的文件中是否有前导/尾随空格?
  • awk 语句用于带有某些条件的循环。由于这种情况,有时 filter.txt 是空的,虽然 data.txt 有数据行,但我得到 op.txt 为空。在这种情况下,op.txt 应该等于 data.txt,因为匹配的模式是空的(filter.txt 为空)。
  • 感谢您的帮助@codeforester。我将作为单独的问题发布,以供更多观众使用
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2013-06-07
相关资源
最近更新 更多