Сумма каждого столбца в файле должна быть гибкой и охватывать столько столбцов, сколько их в файле.

Сумма каждого столбца в файле должна быть гибкой и охватывать столько столбцов, сколько их в файле.

Привет, мне нужно получить сумму каждого столбца в файле, нужно иметь возможность работать со столькими столбцами, сколько их в любом файле.

в настоящее время я использую:

awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'

Однако это дает мне только сумму первого столбца, которую я, очевидно, мог бы зациклить, но я бы предпочел что-то более простое.

Есть идеи/ответы?

решение1

Этоделаетвывести сумму каждого столбца, но в одном столбце (при условии, что данные разделены пробелами):

$ cat data.in
1 2
3 4
5 6

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12 
9 

Так что это вопросне выводить новую строку между каждой суммой.

$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9

Функция printf()принимает строку формата. Это %dстрока форматирования для целого числа (используется %fдля чисел с плавающей точкой), а следующий пробел также будет выведен после целого числа. Затем мы завершаем выводом явного символа новой строки после цикла.

Другой способ решения — использование ORSпеременной («Output Record Separator»):

$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9

Также ознакомьтесь с проницательным предупреждением Дэйва Томпсона в комментариях ниже о порядке ключей в ассоциативных массивах Awk (которые не обязательно будут отсортированы).

решение2

perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in

Связанный контент