
Привет, мне нужно получить сумму каждого столбца в файле, нужно иметь возможность работать со столькими столбцами, сколько их в любом файле.
в настоящее время я использую:
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