
列の合計を計算するシナリオがあります。
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]);
}'