grep:计算所有模式的所有匹配项

时间:2011-10-20 18:53:28

标签: linux command-line grep

我想要在一个非常大的文件中找到数万个(固定的)模式。我想计算每种模式的总命中数。我在grep文档中找不到任何暗示这是可能的。我的设置看起来像这样:

gunzip -c bigfile.txt.gz | grep -c -f patterns.txt

当然,这会计算与patterns.txt任何相匹配的行,而我想要的是每个模式的单独点击次数。在grep的命令行上是否可以这样?或者我必须写一个程序吗?

2 个答案:

答案 0 :(得分:0)

我不知道同时为所有模式执行此操作,但您可以编写一个bash脚本,一次读取一个并执行grep | wc -l为每一个。

答案 1 :(得分:0)

如此:

gunzip -c bigfile.txt.gz | grep -f patterns.txt | sort | uniq -c

排序可能有点大,因为它会节省整个输出。带有哈希的快速perl / python / ...脚本可以大大降低它。

$ grep -f pats.txt a.txt  | ./t.rb 
a 3
b 3
c 2

这是避免排序的脚本,看看它是否真的加快了速度。

#!/usr/bin/env ruby
results = {}
while gets
  line = $_.chomp
  results[line] ||= 0
  results[line]+= 1
end
results.each { |k,v| puts ""#{k} #{v}"}