異なる形式の.csvファイルデータの複数列の合計を計算することはできません。

異なる形式の.csvファイルデータの複数列の合計を計算することはできません。

列の合計を計算するシナリオがあります。

SAL|CAL|TAG|VAL
12.11"|"1.1"|"2.1"|"1.1
13.11"|"1.1"|"2.2"|"2.2
14.11"|"1.1"|"2.4"|"2.4

以下のコードは出力を提供せず、出力は0.00です。

この列 CAL VAL の出力が必要です。

awk -F'|' '{T+=$2} END { printf "%.2f\n", T }' demo.txt

出力:

6.7 5.7

答え1

ファイル内の区切り文字が一致しないか(|ヘッダー行には通常の区切り記号がありますが、"|"後ろに区切り文字があります)、区切り文字は一致しますが|フィールド参照は一致しません("最初のフィールドの開始フィールドと"最後のフィールドの閉じるフィールドと同じです)。なくなった)。

どちらも加算を実行しようとすると、数値がゼロに変換されるように-F'|'値を$2設定すると、文字列に解析されます。"1.1"

awkのシステムバージョンがフィールド区切り文字の正規表現をサポートしている場合は、代わりにオプションの先行および末尾の引用符で-F'"?\\|"?'許可(リテラル)を使用できます。|

$ awk -F'"?\\|"?' '{T+=$2} END { printf "%.2f\n", T }' demo.txt
3.30

答え2

期待される出力にTAG列とVAL列を追加したようです。

入力したCSVが無効であることが確認されました。 12.11などのフィールドを参照できないか、「12.11」などのフィールドを参照できます。部分引用符は無効です。

これを行うには、列見出しに「数値」値を追加しないことを含む2つの方法があります。 (これらのどれもテストされていません。)

(a)実際の状況に合わせてフィールド区切り文字を定義します。

awk '-F"[|]"' 'NR == 1 { next; }
{ T3 += $3; T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'

(b) 各フィールドを使用する前に修正してください。

awk '-F|' 'NR == 1 { next; }
{ gsub ("\042", "", $3); T3 += $3; }
{ gsub ("\042", "", $4); T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'

これがYesで、より多くの列を使用してこれを行う予定の場合は、Tを配列に入れて関数に追加できます。

awk '-F|' 'NR == 1 { next; }
function Sum (f) {
    gsub ("\042", "", $(f)); T[f] += $(f);
}
{ Sum(2); Sum(3); Sum(5); Sum(11); }

END {
    for (f = 1; f < 20; ++f)
        if (f in T) printf ("T%d %.2f\n", f, T[f]);
}'

関連情報