打印匹配模式的总数

打印匹配模式的总数

我使用 API 来获取大约十亿条记录,然后通过这些记录进行awk过滤和管道计数以wc -l对记录进行计数。我目前正在成功地做到这一点:

$apiCall | awk '$1=="xx"' | wc -l > file

但我认为组合 AWK 命令会比通过管道传输到 消耗更少的计算量wc -l,如下所示:

$apiCall | awk '$1=="xx" && END{print NR}' > file

但这不起作用。

答案1

您可能会发现:

LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)'

awk速度要快得多,因为它避免了解释高级语言的开销。

我们用来LC_ALL=C简化文本解释。这也意味着只有 SPC 和 TAB 被理解为分隔符,但awk无论区域设置如何,许多实现都是如此。

GNU/Linux amd64 多核系统上的一些计时来自zsh

$ (repeat 3000 printf '%s\n' {{,xx}{1..1000},xx}" blah blah blah")> a
$ wc a
  6003000  24012000 119412000 a
$ time LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a
3000
LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a  0.15s user 0.03s system 99% cpu 0.175 total
$ time gawk '$1=="xx"{n++};END{print n}' < a
3000
gawk '$1=="xx"{n++};END{print n}' < a  2.00s user 0.05s system 99% cpu 2.055 total
$ time LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a
3000
LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a  1.96s user 0.03s system 99% cpu 1.985 total
$ time mawk '$1=="xx"{n++};END{print n}' < a
3000
mawk '$1=="xx"{n++};END{print n}' < a  1.23s user 0.04s system 99% cpu 1.277 total
$ time gawk '$1=="xx"' < a | wc -l
3000
gawk '$1=="xx"' < a  1.91s user 0.05s system 99% cpu 1.967 total
wc -l  0.00s user 0.00s system 0% cpu 1.967 total

答案2

这个想法是正确的,但是正确的语法awk可以是

$apiCall | awk '$1=="xx"{ count++ }END{ print count }'

由于是awk基于pattern { action }的,一旦我们匹配第一列中的模式xx,我们就会执行在每次出现时增加计数器的操作部分,并且当我们完成处理文件时,在END子句中我们打印出最终计数。> file根据需要将输出重定向到末尾的文件。

相关内容