1

我在命令行工具中遇到了一个非常奇怪的问题。基本上我试图搜索匹配的单词并从文件中获取文本。所以我有 80,000 字的 file1:

aaa
bbb
ccc
ddd
...

我有 600,000 行文本的 file2:

id: hhh, address: xxxx, content: yyyy
id: aaa, address: zzzz, content: eeee
id: jjj, address: qqqq, content: oooo
id: ccc, address: nnnn, content: tttt
...

我需要在file2中找到包含file1中单词的文本,所以输出如下:

id: aaa, address: zzzz, content: eeee
id: ccc, address: nnnn, content: tttt
...

现在我正在使用命令:cat file2 | grep -f file1 > newfile.我也测试了该方法,它运行得很好,它的运行速度也没有什么奇怪的。但是,当我在那个真实文件上运行这个命令时,它超级慢......直到现在它已经运行了 12 个小时并且终端中的命令仍在运行!当我签入新文件时,只生成了 2000 行文本,这意味着如果我需要获得 80,000 行的全部结果,我需要 12 小时的 40 次,这绝对是荒谬的。

另外,我尝试在 file2 上进行实验,即 600,000 行文本。我运行了一个类似的命令cat file2 | grep -w 'aaa',不到一秒就立即得到结果。我还尝试了一个包含几个单词的文件,它也立即得到。所以我不明白,为什么这 80,000 字要花很长时间。即使搜索每个单词需要一秒钟的时间,它仍然只需要不到 20 个小时,这仍然比我目前遇到的情况要快得多......有人能给我提示吗?

4

1 回答 1

3

在 600,000 行中的每一行中搜索 80,000 行中的每一行的代码都需要付出代价。

  • 无条件改变:使用grep -f file1 file2(否cat)。可能会带来轻微的性能提升,但它可以节省一次复制大文件。
  • 可能:添加-F以禁止通配符搜索。这可以避免 80,000 个已编译的正则表达式副本,这些副本实际上是简单的搜索。

    grep -F -f file1 file2
    
  • 查找GNU的-w和选项。他们可以简化搜索。-xgrep
  • 拆分工作量:将 80000 行文件拆分为 80 个文件,每个文件 1000 行;运行该命令 80 次。

最后一个选项有点像“绝望的律师”。如果其他选项不能加快速度,这可能会让您更接近理智的性能(并且至少您将能够对搜索的每组行进行计时以了解它将运行多长时间)。

于 2013-03-27T10:12:25.337 回答