awk суммирует столбец и печатает эту сумму в каждой строке ввода
мой file.txt
выглядит так:
1 12
2 18
3 45
4 5
5 71
6 96
7 13
8 12
Я могу суммировать второй столбец следующим образом:
awk '{ sum += } END { print sum }' file.txt
272
каков самый аккуратный способ, которым я могу напечатать эту сумму в каждой строке? Это то, что я ожидаю:
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 ответов
стандарт 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
вы можете использовать:
awk -v xyzzy=$(awk '{sum+=}END{print sum}' file.txt)
'{print " "xyzzy}' file.txt
это, к сожалению, означает прохождение информации два раза но, так как вы должны сделать это один раз, прежде чем получить общее, нет никакого реального способа обойти это. любой решение будет включать в себя хранение информации перед выводом чего-либо (будь то в массивах или вернуться к файлу).
внутренний awk
работает общее и внешнее awk
присваивает это переменной, которая может быть напечатана вдоль с каждой строкой.
применяя это к файлу:
a 1
b 2
c 3
d 4
e 5
дает вам, потому что 1 + 2 + 3 + 4 + 5
равна 15
:
a 1 15
b 2 15
c 3 15
d 4 15
e 5 15
использовать массивы
{
a[NR] =
sum +=
}
END {
for (x = 1; x <= NR; x++) {
print a[x], sum
}
}
выход
$ 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
подробнее Руководство Gnu Awk
Offtopic, но в Perl вы можете сделать:
perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
awk, да, голова и вставка.
$ yes "`<file.txt awk '{ sum += } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -