sed, awk 및 Perl을 사용하여 새 열의 행을 합산하시겠습니까?

sed, awk 및 Perl을 사용하여 새 열의 행을 합산하시겠습니까?

숫자가 포함된 파일이 있습니다. 예를 들면 다음과 같습니다.

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어떤 종류의 산술 연산에도 적합하지 않습니다.

답변4

순수한 bash 솔루션은 어떻습니까?

while read -r a b c; do
    echo $a $b $c $((a+b+c))
done < input

샘플 실행

관련 정보