내 코드를 사용하여 이름 입력을 기반으로 csv 파일에 있는 열의 특정 이름 값을 합산하려고 합니다. 이것은 내 코드입니다.
#!/bin/bash
updatedata() {
index=0
while IFS="" read -r line
do
IFS=';' read -ra array <<< "$line"
for arrpos in "${array[@]}"
do
if [ "$arrpos" == *"$1"* ] || [ "$1" == "$arrpos" ]
then
break
else
let index=index+1
fi
done
break
done < data.csv
((index=$index+1))
if [ $pos -eq 0 ]
then
v0=$(awk -F";", -v index=$index '{x+=$index}END{print x}' ./data.csv )
elif [ $pos -eq 1 ]
then
v1=$(awk -F";" '{x+=$index}END{print x}' ./data.csv )
elif [ $pos -eq 2 ]
then
v2=$(awk -F";" '{x+=$index}END{print x}' ./data.csv )
elif [ $pos -eq 3 ]
then
v3=$(awk -F";" '{x+=$index}END{print x}' ./data.csv )
fi
}
코드 중간에 v0=에서 볼 수 있듯이 몇 가지 실험을 하려고 하는데 계속 오류가 발생합니다. 먼저 나는 이것을 시도했다:
v0=$(awk -F";" '{x+=$index}END{print x}' ./data.csv)
하지만 다음 오류가 발생합니다. 'awk: 라인 1 또는 그 근처에서 구문 오류가 발생했습니다: }'
그래서 (코드에서 볼 수 있듯이) 시도해보기로 결정했습니다.
v0=$(awk -F";", -v index=$index '{x+=$index}END{print x}' ./data.csv )
다음 오류가 발생합니다: 'awk: 런타임 오류: 인덱스 유형 충돌 또는 키워드 FILENAME="" FNR=0 NR=0에 명령줄을 할당할 수 없습니다.
어떻게 해야할지 모르겠습니다. 도와주실 수 있나요?
답변1
data.csv
일부 CSV 데이터 가 주어지면
A;B;C
1;2;3
4;5;6
-1.2;3;3.3
colname
다음 스크립트는 명령줄에 제공된 변수로 명명된 열의 합계를 계산합니다.
BEGIN {
FS = ";"
if (colname == "") {
print "Did not get column name (colname) to work with" >"/dev/stderr"
exit 1
}
}
FNR == 1 {
colnum = 0
for (i = 1; i <= NF; ++i)
if ($i == colname) {
colnum = i
break
}
if (colnum == 0) {
printf "Did not find named column (colname = \"%s\")\n", colname >"/dev/stderr"
exit 1
}
sum = 0
next
}
{
sum += $colnum
}
END {
print sum
}
테스트해보세요:
$ awk -v colname='A' -f script.awk data.csv
3.8
$ awk -v colname='B' -f script.awk data.csv
10
$ awk -v colname='C' -f script.awk data.csv
12.3
$ awk -v colname='D' -f script.awk data.csv
Did not find named column (colname = "D")
많은 오류 검사가 필요 없는 짧은 스크립트 변형:
BEGIN { FS = ";" }
FNR == 1 {
for (i = 1; i <= NF; ++i)
if ($i == colname) break
if (i > NF) exit 1
next
}
{ sum += $i }
END { print sum }
또는 "한 줄"로:
$ awk -v colname='A' -F ';' 'FNR == 1 { for (i = 1; i <= NF; ++i) if ($i == colname) break; if (i > NF) exit 1; next } { sum += $i } END { print sum }' data.csv
그러나 이상적으로는 CSVkit과 같은 특정 형식의 CSV 파서를 사용해야 합니다.
$ csvstat --sum -c A data.csv
3.8
이 csvstat
유틸리티는 특정 CSV 파일에 대해 다양한 통계를 계산할 수 있습니다. 여기서는 구분 기호를 독립적으로 찾습니다 ;
. 이 예에서는 이름이 지정된 열의 합계를 제공하도록 요청합니다 A
.