awk additionner une colonne et imprimer cette somme sur chaque ligne d'entrée

Mon file.txt ressemble à ceci:

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 += } END { print sum }' file.txt

272

Quelle est la meilleure façon d'imprimer cette somme sur chaque ligne? C'est ce que j'en 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
demandé sur Steve 2012-05-09 10:36:40

6 réponses

sorte de norme awk.

$ awk 'FNR==NR{sum+=;next}; {print ,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
répondu kev 2012-05-09 07:04:36

Vous pouvez utiliser:

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

cela signifie malheureusement passer en revue l'information deux fois mais, puisque vous devez le faire une fois avant d'obtenir le total, il n'y a pas de vrai moyen de l'éviter. la solution consiste à stocker l'information avant de la diffuser (que ce soit dans des tableaux ou en retournant au fichier).

L'intérieur awk marche totale et l'extérieur awk assigne à une variable qui peut être imprimé à chaque ligne.

Appliquer que dans le 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
répondu paxdiablo 2015-07-21 09:08:22

Utiliser des tableaux

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

Sortie

$ 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

Lire la suite Manuel Gnu Awk

3
répondu Fredrik Pihl 2012-05-09 06:47:24

Hors-sujet, mais en Perl que vous pouvez faire:

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
1
répondu codaddict 2012-05-09 06:44:13

Le laid solution:

awk '{printf "%s ", }{system(" awk 7 {sum+=}END{print sum} 7  file ")}' file
1
répondu Tedee12345 2012-05-09 11:50:37

awk, oui, de la tête et coller.

$ yes "`<file.txt awk '{ sum +=  } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -
1
répondu Taku Miyakawa 2012-05-10 01:17:24