何がしたいか
とあるcsvには各行の各列に数値が入っていて、それらを合計したい
awkで出来そうだなぁ、と思ってはいたものの、なぜか躓いてしまい、すぐにやりたいことを出来なかったので自分用メモとして残しておく
データは下記のようなcsvフォーマットでたくさんのレコードがあるイメージ
test.csv
abc,123,0,234,0,0,456,567
abc,123,0,234,0,0,456,567
abc,123,0,234,0,0,456,567
abc,123,0,234,0,0,456,567
アウトプットのイメージ
output
abc,1380
abc,1380
abc,1380
abc,1380
どう解決したか
sample.sh
#!/bin/bash
FILE="test.csv"
cat $FILE | while read LINE
do
ID=$(awk -F, '{ print $1 }' <<< $LINE)
SUM=$(awk -F',' '{ for(i=2; i<NF+1; ++i){ sum+=$i } print sum }' <<< $LINE)
echo "$ID,$SUM"
done
1行ずつ読み込む。LINEが1行ごとの変数になる
cat $FILE | while read LINE
IDを抜き出す(例の場合は"abc")。こういう書き方じゃなくてもいいかも知れないけれど、次でawkを使うので統一した
ID=$(awk -F, '{ print $1 }' <<< $LINE)
forを使い、2列目から最後の列までを足し、printで結果を表示する。が、それは変数SUMに代入される
SUM=$(awk -F',' '{ for(i=2; i<=NF+1; ++i){ sum+=$i } print sum }' <<< $LINE)
ちなみに
<<<
はヒアストリング
<<
はヒアドキュメント
読み方を知らなかったので、これもメモしておく