Ответ 1
Вид стандартного способа 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
Мой file.txt
выглядит следующим образом:
1 12
2 18
3 45
4 5
5 71
6 96
7 13
8 12
Я могу суммировать второй столбец следующим образом:
awk '{ sum += $2 } 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
Вид стандартного способа 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
Вы можете использовать:
awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
'{print $0" "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] = $0
sum += $2
}
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 '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047 file ")}' file
awk, да, голова и вставка.
$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -