파일에 있는 각 열의 합계입니다. 파일에 있는 열 수만큼 처리하려면 유연성이 필요합니다.

파일에 있는 각 열의 합계입니다. 파일에 있는 열 수만큼 처리하려면 유연성이 필요합니다.

안녕하세요. 파일의 각 열의 합계를 구해야 하며 특정 파일에서 최대한 많은 열을 처리할 수 있는 유연성이 필요합니다.

현재 나는 다음을 사용합니다:

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

관련 정보