Soma todos os valores em uma coluna com um cabeçalho especificado

1

Eu tenho um arquivo que tem seções com tabelas diferentes. Eu quero somar todos os valores contidos em cada coluna com o cabeçalho N * dN

Por exemplo:

omega (dN/dS) = 999.00000

dN & dS for each branch

 branch          t       N       S   dN/dS      dN      dS  N*dN  S*dS

  11..6      0.000   532.0   266.0 999.0000  0.0000  0.0000   3.0   0.0
  11..7      0.000   532.0   266.0 999.0000  0.0000  0.0000   4.0   0.0
  11..12     0.000   532.0   266.0 999.0000  0.0000  0.0000   0.5   0.0

omega (dN/dS) = 1.00000

dN & dS for each branch

 branch          t       N       S   dN/dS      dN      dS  N*dN  S*dS

  11..6      0.000   532.0   266.0 999.0000  0.0000  0.0000   7.0   0.0
  11..7      0.000   532.0   266.0 999.0000  0.0000  0.0000   2.0   0.0
  11..12     0.000   532.0   266.0 999.0000  0.0000  0.0000   0.4   0.0

Saída desejada:

7.5
9.4

Talvez alguma modificação de

awk '{s+=$8}END{print s}'

onde eu posso especificar o título da coluna e fazer com que ele imprima os resultados separados de cada soma, não a soma das somas ...

    
por Manuel 19.08.2017 / 23:01

4 respostas

1

Você pode usar awk desta forma (supondo que o conteúdo seja sempre seguido pelo cabeçalho correspondente e pelas mesmas contagens em todos os +, não havendo linhas vazias entre eles).

awk 'f{s+=$8;f++} ($8=="N*dN"){f=1} (f>4){print s;f=s=0}' infile

Ou, no caso geral, use-o como abaixo. Será somado até o próximo N*dN visto na coluna # 8:

awk 'f{s+=$8} (f &&$8=="N*dN"){print s;f=s=0} ($8=="N*dN"){f=1} END{print s}' infile
    
por 20.08.2017 / 09:19
1

Outra abordagem do awk :

awk '$8=="N*dN"{ r=NR; if(s) print s; s=0 }r && NR-r<5{ s+=$8 }END{ print s }' file

A saída:

7.5
9.4
    
por 20.08.2017 / 11:01
0

Bem, não é uma coisa engraçada com os olhos de um programador, mas é realmente rápido e tudo bem para tarefas simples.

Como podemos ver, todas as linhas interessantes contêm a string .. , então podemos filtrá-las com grep :

grep -F '..' <input.txt|awk 'BEGIN{s=0}{s+=$8}END{print s}'

Para fazer isso com várias colunas, você precisa usar várias variáveis (por exemplo, $a , $b , $c , ...).

    
por 19.08.2017 / 23:16
0

Você pode usar algo assim:

(awk '{if($8=="N*dN")next}{print 0$8}' data.txt | tr '\n' '+'; echo 0) | bc -l

{if($8=="N*dN")next} descarta cabeçalhos inúteis

{print 0$8} imprime o oitavo campo com um '0' inicial (irá substituir campos vazios por 0).

tr '\n' '+'; echo 0 substituirá o final das linhas por '+' e por um 0 final

bc -l somará tudo isso

    
por 20.08.2017 / 03:29