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 '{printf "%s ", }{system(" awk 7 {sum+=}END{print sum} 7  file ")}' file

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

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