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