Soma o valor ao lado do padrão específico

2

Eu tenho um arquivo com várias tags com um número ao lado, por exemplo,

<Overall>4
other <tags> and data
<Overall>2
other <tags> and data
<Overall>3

Como eu procuraria pelo arquivo e contaria todos os números ao lado da tag geral? e, em seguida, divida o número pelo número de tags gerais para obter uma média geral.

Assim, por exemplo, no código acima, a média seria 3.

E, em seguida, percorra todos os arquivos no diretório atual e liste a média geral de cada arquivo.

    
por tom 15.02.2016 / 14:48

4 respostas

3

Usando o awk (assumindo que tudo o que está em linhas gerais é isso e um número)

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print "AVG:",y/x}' file

x é incrementado para cada sub bem sucedido de <Overall> com nada. Isso significa que ele é incrementado apenas nas linhas que contêm <Overall> .

O bloco depois adiciona o número que é deixado na linha ao total.

END é executado no final do programa.

No bloco final, o avg é impresso.

EDIT: para muitos arquivos

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print FILENAME,"AVG:",y/x}' LISTOFFILES
    
por 15.02.2016 / 14:55
1

com perl :

perl -lne 'for (/<Overall>([\d.eE+-]+)/g) {$n++; $sum += $1}
           END{print $sum/$n if $n}'

Isso tem a vantagem de poder lidar com mais de um <Overall> tag por linha. [\d.eE+-]+ é um correspondente bruto para um número decimal de ponto flutuante (permitindo coisas como 12, 1.2, -1E + 20 (embora também coisas que não são números válidos)).

    
por 15.02.2016 / 15:11
1

Aqui está uma maneira crua no awk:

awk '/^<Overall>/ { 
    sub("<Overall>", ""); 
    sum += $1; 
    lines++; 
  } 
  END { print sum / lines}' 
  tags  ### this is your input file
    
por 15.02.2016 / 14:53
1

Aqui está uma solução usando alguns utilitários interessantes:

grep "^<Overall>\d\+" file | cut -c 10 | paste -s -d + - | bc
  1. Pesquise no arquivo as linhas que começam com "< Overkill >" seguido por uma cadeia de dígitos (ou seja, um número).
  2. Recorte o número do resto da linha.
  3. Concatena todas as linhas com um símbolo "+" entre
  4. Passe o resultado para bc , o que calculará a soma
por 15.02.2016 / 18:51