awk 내의 배열을 합산합니까?

awk 내의 배열을 합산합니까?

다음 코드가 있습니다.

sum1=
sum2=    
declare -a a
echo $temp | awk '{split($0,a,","); name=a[1] ; for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }'

이 코드는 작동하지 않습니다. 여기서 temp는 문자열 유형입니다.

abc,1,2,3,4,5,6

실제로 파일의 데이터를 구문 분석하고 있습니다. 입력 파일은 다음과 같습니다.

abc,1,2,3,4,5,6
de,3,5,7,8,4,2
xyz,6,5,3,7,8,2

읽어서 사용하고 있어요

while  read temp
do
 #do something
done < sample.csv

예상되는 출력은 다음과 같은 형식입니다.

Name   Sum1  Sum2
abc      6    15
de      15    14
xyz     14    17 

답변1

이 시도:

$ awk -F',' 'BEGIN{OFS="\t";print "Name","Sum1","Sum2"}
                  {print $1,$2+$3+$4,$5+$6+$7}' sample.csv 
Name        Sum1 Sum2
abc         6    15
de          15   14
xyz         14   17

Bash 루프는 필요하지 않습니다 awk. 이 -F옵션을 사용하면 입력 필드 구분 기호(이 경우)를 정의할 수 있으므로 ,명시적으로 줄을 분할할 필요가 없습니다. awk파일은 한 줄씩 읽혀지므로 둘 중 하나도 읽을 필요가 없습니다 bash.

BEGIN{}블록은 첫 번째 줄을 읽기 전에 실행되며 헤더만 인쇄하고 설정합니다.출력 구분자( OFS) 탭으로 이동합니다. 필드가 이미 분리되어 있으므로 2-4와 5-7 필드를 합산하여 각 줄에 인쇄하기만 하면 됩니다.

답변2

$temp 설정

$temp먼저 변수를 올바르게 설정 했는지 확인하세요 .

$ temp="abc,1,2,3,4,5,6"
$ echo "$temp"
abc,1,2,3,4,5,6

간단한 예

이를 위해 다음 방법을 사용합니다.

$ echo "$temp" | tr ',' '\n' | grep -v abc | awk '{sum+=$1};END{print sum}'
21

당신의 모범

귀하의 방법과 관련하여 청크로 쌓인 배열을 인쇄하는 것을 잊었습니다 END{...}.

$ echo "$temp" | awk '{split($0,a,","); name=a[1]
      for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }
      END{print sum1; print sum2}'
6
15

나중에 저장

Awk는 호출된 상위 셸에 결과를 다시 주입할 수 있는 방법이 없으므로 몇 가지 트릭을 사용하고 결과를 Bash의 배열에 저장해야 합니다.

$ myarr=($(echo "$temp" | awk '{split($0,a,","); name=a[1]
      for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }
      END{ print sum1; print sum2}'))

작동 방식은 다음과 같습니다.

$ myarr=($(...awk command...))

이렇게 하면 값이 배열에 저장 sum1됩니다 .sum2$myarr

$myarr 어레이에 액세스

다음과 같이 액세스할 수 있습니다.

$ echo "${myarr[@]}"
6 15

$ echo "${myarr[0]}"
6

$ echo "${myarr[1]}"
15

답변3

불다

#!/usr/bin/env bash
printf "%-5s\t%s\t%s\n" Name Sum1 Sum2
while IFS=, read -a Arr
do
        (( Grp1 = Arr[1] + Arr[2] + Arr[3] ))
        (( Grp2 = Arr[4] + Arr[5] + Arr[6] ))

        printf "%-5s\t%d\t%d\n" ${Arr[0]} $Grp1 $Grp2

done < input.txt

산출

root@ubuntu:~# bash  parse.sh
Name    Sum1    Sum2
abc     6       15
de      15      14
xyz     14      17

배열 요소에 대한 산술 팁을 제공한 @1_CR에게 감사드립니다.

관련 정보