次のコードがあります。
sum1=
sum2=
declare -a a
echo $temp | awk '{split($0,a,","); name=a[1] ; for(i=2;i<=4;i++) sum1+=a[i] ; for(i=5;i<=7;i++) sum2+=a[i] }'
このコードは機能しません。ここで temp は文字列型です。
abc,1,2,3,4,5,6
実際にファイルのデータを解析しています。入力ファイルは次のとおりです。
abc,1,2,3,4,5,6
de,3,5,7,8,4,2
xyz,6,5,3,7,8,2
読んで使っています。
while read temp
do
#do something
done < sample.csv
予想される出力は次の形式です。
Name Sum1 Sum2
abc 6 15
de 15 14
xyz 14 17
ベストアンサー1
この試み:
$ awk -F',' 'BEGIN{OFS="\t";print "Name","Sum1","Sum2"}
{print $1,$2+$3+$4,$5+$6+$7}' sample.csv
Name Sum1 Sum2
abc 6 15
de 15 14
xyz 14 17
Bashループは必要ありませんawk
。この-F
オプションを使用すると、入力フィールド区切り文字(この場合)を定義できるため、明示的に行を,
分割する必要はありません。awk
ファイルは1行ずつ読み取られるため、どちらも読み込む必要はありませんbash
。
このBEGIN{}
ブロックは最初の行を読み取る前に実行され、ヘッダーのみを印刷して設定します。出力区切り文字(OFS
)タブに移動します。フィールドはすでに分離されているので、2-4フィールドと5-7フィールドを合計して各行に印刷するだけです。