안녕하세요. 파일의 각 열의 합계를 구해야 하며 특정 파일에서 최대한 많은 열을 처리할 수 있는 유연성이 필요합니다.
현재 나는 다음을 사용합니다:
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
또 다른 해결 방법은 ("출력 레코드 구분 기호") 변수를 사용하는 것입니다 .
$ 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의 연관 배열의 키 순서에 대한 아래 설명에서 Dave Thompson의 통찰력 있는 경고도 참조하세요(순서는 보장되지 않습니다).
답변2
perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in