Adicionando números do resultado de um grep

21

Eu corro o seguinte comando:

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

e obtenho o seguinte resultado:

1
4
0
8

Gostaria de adicionar cada um dos números a uma variável de contagem em execução. Existe um forro mágico que alguém possa me ajudar a construir?

    
por Amir Afghani 14.12.2010 / 22:11

5 respostas

28
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

Isso não imprime a lista, mas imprime a soma. Se você quer a lista e a soma, você pode fazer:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'
    
por 14.12.2010 / 22:18
8

Isso tudo pode ser feito no awk também:

awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt
    
por 16.12.2010 / 07:39
6

Você parece estar usando o sistema GNU , então se o suporte a expressões regulares Perl estiver disponível, você poderia escrever algo assim:

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

P.S. Eu modifiquei a expressão regular (adicionei o + quantificador) para permitir números > 9.

P.S. Alternativamente, o awk é suficiente (assumindo GNU awk ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile
    
por 16.12.2010 / 09:25
3

Tente colocar a saída do seu grep em

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'
    
por 14.12.2010 / 22:19
2

Eu uso isso:

$ echo $(cat file | sed 's/$/+/') 0 | bc

Não é eficiente para listas grandes, mas para a maioria dos meus casos de uso, tudo bem. Eu costumo usar uma função de shell para automatizar o processo para que eu tenha que fornecer apenas um nome de arquivo:

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

Você sempre pode substituir o marcador de fim de linha por um separador de elemento específico ou classe de caractere se os dados forem delimitados de outra maneira.

    
por 13.03.2013 / 03:59

Tags