私のコードを使用して、名前入力に基づいて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
。