Imprimir contagem total para um padrão correspondente

1

Eu uso uma API para buscar um bilhão ou mais de registros, os quais eu corro através de awk para filtrar e encaminhar para wc -l para contar os registros. Atualmente estou fazendo isso com sucesso:

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

Mas acho que a combinação de um comando AWK consumirá menos computação do que o piping para wc -l , algo assim:

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

Mas isso não está funcionando.

    
por Steve 20.03.2018 / 13:31

2 respostas

2

A ideia está certa, mas a sintaxe certa para fazer isso em awk poderia ser fazer para

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

Como awk é pattern { action } , quando combinamos o padrão de xx na primeira coluna, fazemos a ação de incrementar um contador em cada ocorrência e quando terminamos de processar o arquivo, na% cláusulaEND imprimimos a contagem final. Reorientar a saída para um arquivo no final com > file conforme necessário.

    
por 20.03.2018 / 13:35
3

Você pode descobrir que:

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

é consideravelmente mais rápido, pois evita a sobrecarga de awk ter que interpretar uma linguagem de nível superior.

Estamos usando LC_ALL=C para simplificar a interpretação do texto. Isso também significa que apenas SPC e TAB são entendidos como delimitadores, mas esse é o caso de muitas implementações awk , independentemente da localidade.

Algumas temporizações em um sistema multi-core amd64 GNU / Linux de 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
    
por 20.03.2018 / 14:04

Tags