registro on-line de linhas exclusivas

2

uniq -c é muito útil para contar o número de vezes que a mesma linha aparece consecutivamente

$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | uniq -c

100 bye
100 hi
800 bye

No entanto, para obter uma contagem para cada linha única, primeiro tenho que classificar a entrada, o que parece um pouco ineficiente.

$ seq 1 1000 | awk '{ if ($1 > 100 && $1 <= 200) { print "hi" } else {print "bye"} }' | sort | uniq -c

Existe uma maneira idiomática de registrar todas as ocorrências de linhas exclusivas usando um algoritmo on-line?

    
por Gregory Nisbet 27.05.2016 / 18:31

1 resposta

1

Classificar primeiro a entrada é o mais eficiente possível.

Você pode fazer isso com um one-liner awk:

awk '{++seen[$0]} END {for (line in count) printf "%7d %s\n", count[line], line}'

Qual deles é mais eficiente (em memória e tempo de CPU) depende dos dados e da implementação. sort é menos eficiente em teoria porque faz um trabalho extra, mas por outro lado tem um trabalho e o faz bem, enquanto o awk é uma ferramenta de propósito geral. Se houver muitas duplicatas, o awk usa menos memória e é provavelmente um pouco mais rápido. Por outro lado, muitas implementações de ordenação podem lidar com grandes conjuntos de dados que não se encaixam na RAM, enquanto o awk apenas irá debater.

    
por 29.05.2016 / 00:17

Tags