2012-05-09 3 views
23

My file.txt выглядит следующим образом:AWK сумма столбца и печать, что сумма в каждой строке ввода

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 
+0

Спасибо всем! Здесь очень полезные ответы. Приветствия. – Steve

ответ

19

Вид стандартного 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 
+0

Суффикс '{,}' подстановки - это сокращение для повторного ввода имени входного файла дважды. Это не стандартная оболочка Борна. – tripleee

+1

Это канонический AWK и не сохраняет файл в памяти. Это должен быть принятый ответ. –

+0

@DennisWilliamson, Здравствуйте, не могли бы вы объяснить, по какой причине этот awk не хранит файл в памяти?спасибо –

1

оффтопик, но в Perl вы можете сделать:

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

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

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 
+0

@codaddict: вы имели в виду «... _can't_ store ...»? – paxdiablo

+0

yes..I не знаю, что там произошло :) – codaddict

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 Manual

1

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

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

AWK, да, голова и паста.

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