awkコマンドに変数を追加する方法

awkコマンドに変数を追加する方法

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

関連情報