Conte a soma de cada coluna em um arquivo

8

Em um arquivo com um número diferente de colunas delimitadas por espaço '', Como contar a soma das colunas. Um exemplo mostraria a necessidade:

File A:

1 2 
2 3
4 5 6 
1 1 1 5

Em seguida, a saída seria:

  • para a coluna 1 (1 + 2 + 4 + 1) = 8
  • para a coluna 2 é 11
  • para a coluna 3 é 7
  • para a coluna 4 é 5
por Maythux 15.06.2015 / 13:53

6 respostas

12

Usando awk

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print "for column "i" is " sum[i];}' FileA
for column 1 is 8
for column 2 is 11
for column 3 is 7
for column 4 is 5
    
por steeldriver 15.06.2015 / 14:05
4

Use numsum para essa tarefa e separe entre o processamento de dados e a saída dos resultados.

Instale num-utils , precisamos de numsum

sudo apt-get install num-utils

E comece com

numsum -c <your_file_name>

Exemplo

$ cat "File A"
1 2 
2 3
4 5 6 
1 1 1 5

$ numsum -c "File A"
8 11 7 5

ou com o formato desejado:

$ numsum -c "File A" | awk '{for(i=1;i<=NF;i++) {print "for column "i" is "$i}}'
for column 1 is 8
for column 2 is 11
for column 3 is 7
for column 4 is 5

de man numsum

-c      Print out the sum of each column.

exemplos de man numsum

EXAMPLES

   Add up the 1st, 2nd and 5th columns only.

       $ numsum -c -x 1,2,5 columns
       15 40 115

   Add up the rows of numbers of a file.

        $ numsum -r columns
        55
        60
        65
        70
        75
    
por A.B. 15.06.2015 / 20:39
3
#!/bin/sh

while read a b c d; do
    col1=$((col1 + a))
    col2=$((col2 + b))
    col3=$((col3 + c))
    col4=$((col4 + d))
done < File_A

echo $col1 $col2 $col3 $col4
    
por Florian Diesch 15.06.2015 / 14:02
3

A julgar pelos comentários à sua própria resposta, você deseja apenas a soma de uma coluna de cada vez. Se assim for, aqui está uma maneira não-awk para fazê-lo:

cut -d' ' -f3 FileA | grep . | paste -s -d+ | bc

onde você substituiria o 3 pelo número da coluna em que você está interessado.

    
por Digital Trauma 15.06.2015 / 20:11
0

Aqui está uma abordagem de script Perl de uma linha. Isso depende do uso de -a flag, que permite que a divisão automática leia linha com -n flag na matriz @F . Tudo o que temos a fazer é iterar esses itens e adicioná-los ao respectivo índice em $sum array, assim, efetivamente, cada item da matriz é a soma de cada coluna respectiva. Finalmente, nós imprimimos o resultado dentro do bloco de código END .

$ perl -lane '$j=0;foreach $i (@F){$sum[$j]+=$i; $j+=1;}; END{print join("\n",@sum)} ' input.txt                                                     
8
11
7
5

Alternativamente, aqui está uma abordagem completa de script Perl. Ele se baseia em dividir cada linha em array e iterar sobre cada item desse array, adicionando cada número à sua respectiva propriedade em @sums array. O script imprime cada linha e, em seguida, produz o relatório para cada coluna. A impressão de cada linha pode ser removida adicionando # antes de printf("%s",$line);

#!/usr/bin/env perl
use strict;
use warnings;

open(my $fh,"<",$ARGV[0]); 
my $i = 0;
my @sums;

while(my $line = <$fh>) { 
    printf("%s",$line);
    my @nums = split(" ",$line);
    my $j = 0;
    foreach my $num (@nums){
        $sums[$j] += $num;
        $j += 1;
    }

}

my $k = 0;
foreach my $sum (@sums){
    printf("- column %d sum: %d\n",$k,$sum);
    $k+=1;
}

close($fh);

O uso é simples chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt . Por exemplo:

$ ./sum_columns_2.pl input.txt                                                                                                                       
1 2 
2 3
4 5 6 
1 1 1 5
- column 0 sum: 8
- column 1 sum: 11
- column 2 sum: 7
- column 3 sum: 5
    
por Sergiy Kolodyazhnyy 25.02.2017 / 20:27
-2

Uma solução simples:

awk '{sum += $i} END {print sum}' file

Substitua i por um número de coluna, por exemplo, coluna1:

awk '{sum += } END {print sum}' file

saída é:

8
    
por Maythux 15.06.2015 / 14:04