Aquí hay un enfoque de guión Perl de una línea. Esto se basa en el uso de -a
flag que permite la división automática de la línea actualmente leída con -n
flag en array @F
. Todo lo que tenemos que hacer es iterar sobre esos elementos y agregarlos a su índice respectivo en la $sum
matriz, por lo que efectivamente cada elemento de la matriz es la suma de cada columna respectiva. Finalmente, imprimimos el resultado dentro del END
bloque 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
Alternativamente, aquí hay un enfoque completo de script Perl. Se basa en dividir cada línea en una matriz e iterar sobre cada elemento de esa matriz agregando cada número a su posición respectiva en la @sums
matriz. El script imprime cada línea, luego produce un informe para cada columna. La impresión de cada línea se puede eliminar agregando #
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);
El uso es simple chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt
. Por ejemplo:
$ ./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