숫자가 포함된 파일이 있습니다. 예를 들면 다음과 같습니다.
1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5
행을 합산하고 결과를 열로 출력하려면 어떻게 해야 합니까? 결과는 다음과 같습니다.
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
sed, awk 및 Perl의 솔루션을 보고 싶습니다.
답변1
펄 솔루션:
perl -MList::Util=sum -lane 'print "@F ", sum(@F)' < data.txt
-n
입력을 한 줄씩 읽습니다.-l
입력에서 개행 문자를 제거하고 출력에 추가합니다.-a
각 입력 라인을 여백의 @F 배열로 분할합니다.- 목록::유틸리티이
sum
기능이 제공되므로 숫자를 직접 합산할 필요가 없습니다.
sed에서는 연산이 거의 불가능하지만 sed를 사용하여 공백을 더하기 기호로 변환하고 이를 sum의 소스로 사용하고 bc
결과를 입력에 붙여넣을 수 있습니다.
paste -d ' ' data.txt <(sed -r 's/ /+/g' data.txt | bc)
답변2
데이터가 data.txt라는 파일에 저장되어 있다고 가정합니다.
cat data.txt
1 11 323
2 13 3
3 44 4
4 66 23
5 70 23
6 34 23
7 24 22
8 27 5
다음과 같이 진행할 수 있습니다 awk
.
awk '{X=$0}{split(X,x)}{print X , x[1]+x[2]+x[3]}' data.txt
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
또는 @RudiC의 의견에 따르면:
awk '{print $0, $1+$2+$3}' data.txt
답변3
원하는 수의 열에 대해 다음을 사용하십시오 awk
.
$ awk '{ sum = 0; for (i = 1; i <= NF; i++) sum += $i; $(NF + 1) = sum } 1' <file
1 11 323 335
2 13 3 18
3 44 4 51
4 66 23 93
5 70 23 98
6 34 23 63
7 24 22 53
8 27 5 40
NF
현재 레코드(기본값은 행)의 필드 수(기본값은 공백으로 구분된 열)입니다. sum
계산을 반복하고 합계를 설정하여 끝에 $(NF + 1)
새 열을 추가합니다. 이 새 열은 스크립트 1
끝의 다른 열과 함께 별도로 인쇄됩니다 awk
( 로 대체 가능 { print }
).
sed
어떤 종류의 산술 연산에도 적합하지 않습니다.