파일의 각 열 합계는 파일에 있는 열 수만큼 유연해야 합니다.

파일의 각 열 합계는 파일에 있는 열 수만큼 유연해야 합니다.

안녕하세요. 파일에 있는 모든 열의 합계를 구해야 하고, 주어진 파일에 있는 열 수만큼 유연하게 처리해야 합니다.

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

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

관련 정보