Подтвердить что ты не робот

Awk суммировать столбец и печатать эту сумму на каждой строке ввода

Мой 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
4b9b3361

Ответ 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

Ответ 2

Вы можете использовать:

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

Ответ 3

Использовать массивы

{ 
    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

Ответ 4

Offtopic, но в Perl вы можете сделать:

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt

Ответ 5

Уродливое решение:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047  file ")}' file

Ответ 6

awk, да, голова и вставка.

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -