다음 코드가 있습니다.
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에게 감사드립니다.