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
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:
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
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
#!/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
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.
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
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
Tags command-line scripts