Aqui está uma abordagem de script Perl de uma linha. Isso depende do uso de -asinalizador, que permite a divisão automática da linha atualmente lida com o -nsinalizador na matriz @F. Tudo o que precisamos fazer é iterar sobre esses itens e adicioná-los ao respectivo índice na $summatriz, assim, efetivamente, cada item da matriz é soma para cada coluna respectiva. Finalmente, imprimimos o resultado no ENDbloco de código.
$ perl -lane '$j=0;foreach $i (@F){$sum[$j]+=$i; $j+=1;}; END{print join("\n",@sum)} ' input.txt
8
11
7
5
Como alternativa, aqui está uma abordagem completa de script Perl. Ele depende da divisão de cada linha na matriz e da iteração sobre cada item dessa matriz, adicionando cada número à sua respectiva posse na @sumsmatriz. O script imprime cada linha e produz um relatório para cada coluna. A impressão de cada linha pode ser removida adicionando #antesprintf("%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