web-dev-qa-db-fra.com

awk additionne une colonne et imprime cette somme sur chaque ligne d'entrée

Ma file.txt ressemble à ça:

1 12
2 18
3 45
4 5
5 71
6 96
7 13
8 12

Je peux résumer la deuxième colonne comme ceci:

awk '{ sum += $2 } END { print sum }' file.txt

272

Quelle est la meilleure façon d'imprimer cette somme sur chaque ligne? Voici ce que j'attends:

1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
23
Steve

Type de chemin standard awk.

$ awk 'FNR==NR{sum+=$2;next}; {print $0,sum}' file.txt{,}
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
19
kev

Vous pouvez utiliser:

awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
    '{print $0" "xyzzy}' file.txt

Cela signifie malheureusement parcourir les informations deux fois mais, puisque vous devez le faire une fois avant d'obtenir le total, il n'y a pas vraiment de solution. N'importe laquelle la solution impliquera de stocker les informations avant de sortir quoi que ce soit (que ce soit dans des tableaux ou pour revenir au fichier).

Le awk interne calcule le total et le awk externe l'assigne à une variable qui peut être imprimée avec chaque ligne.

Appliquer cela au fichier:

a 1
b 2
c 3
d 4
e 5

vous donne, parce que 1 + 2 + 3 + 4 + 5 est égal à 15:

a 1 15
b 2 15
c 3 15
d 4 15
e 5 15
7
paxdiablo

Utiliser des tableaux

{ 
    a[NR] = $0
    sum += $2
}
END {
    for (x = 1; x <= NR; x++) {
        print a[x], sum
    }
}

Production

$ awk -f s.awk file.txt 
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272

En savoir plus dans Gnu Awk Manual

3
Fredrik Pihl

La solution laide:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047  file ")}' file
1
Tedee12345

awk, oui, tête et colle.

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -
1
Taku Miyakawa

Hors sujet, mais en Perl vous pouvez faire:

Perl -nale '$s+=$F[1];Push(@a,$_);END{print $_." $s" for(@a);}' file.txt
1
codaddict