web-dev-qa-db-fra.com

Compter la somme de chaque colonne dans un fichier

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:

  • pour la colonne 1 (1 + 2 + 4 + 1) = 8
  • pour la colonne 2 est 11
  • pour la colonne 3 est 7
  • pour la colonne 4 est 5
8
Maythux

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
12
steeldriver

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
4
A.B.
#!/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
3
Florian Diesch

À 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.

3
Digital Trauma

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
0
Sergiy Kolodyazhnyy