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
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
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
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
Hors-sujet, mais en Perl que vous pouvez faire:
perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
Le laid solution:
awk '{printf "%s ", }{system(" awk 7 {sum+=}END{print sum} 7 file ")}' file
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 -