Dans un fichier avec un nombre différent de colonnes délimitées par un espace '', Comment compter la somme des colonnes. Un exemple montrerait le besoin:
File A:
1 2
2 3
4 5 6
1 1 1 5
Alors la sortie serait:
Utiliser 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
tilisez numsum
pour cette tâche et séparez le traitement des données et la sortie des résultats.
Installez num-utils
, nous avons besoin de numsum
Sudo apt-get install num-utils
Et commence avec
numsum -c <your_file_name>
Exemple
$ cat "File A"
1 2
2 3
4 5 6
1 1 1 5
$ numsum -c "File A"
8 11 7 5
ou avec le format souhaité:
$ 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.
exemples 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
À en juger par les commentaires de votre propre réponse, vous ne voulez que la somme d’une colonne à la fois. Si tel est le cas, voici une manière non-maladroite de le faire:
cut -d' ' -f3 FileA | grep . | paste -s -d+ | bc
où vous voudriez remplacer le 3
par le numéro de colonne qui vous intéresse.
Voici une approche de script Perl à une ligne. Cela repose sur l'utilisation de l'indicateur -a
qui permet de scinder automatiquement la ligne actuellement lue avec l'indicateur -n
dans le tableau @F
. Tout ce que nous avons à faire est de parcourir ces éléments et de les ajouter à leur index respectif dans le tableau $sum
. Ainsi, chaque élément du tableau correspond à la somme de chaque colonne. Enfin, nous imprimons le résultat dans le bloc de code END
.
$ Perl -lane '$j=0;foreach $i (@F){$sum[$j]+=$i; $j+=1;}; END{print join("\n",@sum)} ' input.txt
8
11
7
5
Sinon, voici une approche de script Perl complète. Il consiste à diviser chaque ligne en tableau et à effectuer une itération sur chaque élément de ce tableau en ajoutant chaque nombre à leur position respective dans le tableau @sums
. Le script imprime chaque ligne, puis génère un rapport pour chaque colonne. L'impression de chaque ligne peut être supprimée en ajoutant #
avant 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);
L'utilisation est simple chmod +x ./sum_columns.pl && ./sum_columns.pl input.txt
. Par exemple:
$ ./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