dataset.csv
7つの数値列を含む大容量データファイルがあります。 AWKが各列の平均と分散を計算する最も速く効率的な方法であることを読んだ。 CSVファイルを繰り返して結果を要約CSVに出力するには、AWKコマンドが必要です。データセットの例:
1 1 12 1 0 0 426530
1 1 12 2 0 0 685455
3 4 12 3 1 0 1182080
1 1 12 4 0 1 3090
2 1 13 5 0 0 386387
1 3 12 6 0 2 233430
3 1 11 7 1 0 896919
1 1 12 8 0 0 16441
生成された要約csvは次のとおりです。最初の行は各列の平均に対応し、2番目の行は分散(サンプルベース)です。
1.625 1.625 12 4.5 0.25 0.375 478791.5
0.839285714 1.410714286 0.285714286 6 0.214285714 0.553571429 1.74812E+11
単一の列値を計算できましたが、すべての列に対して繰り返すにはこの値が必要です。
awk -F' ' '{ total += $1 } END {print total/NR}' dataset.csv > output.csv
ベストアンサー1
すべての列にループが必要です
{ for(i=1;i<=NF;i++) ...
そして配列
... total[i]+=$i ; sq[i]+=$i*$i ; }
その結果、(平均的に)同様のコマンドラインが生成されます。
awk '{ for(i=1;i<=NF;i++) total[i]+=$i ; }
END { for(i=1;i<=NF;i++) printf "%f ",total[i]/NR ;}'
全プログラム
平均と分散を計算するためにawkを使用しましたが、結果は得られませんでした。
{ for(i=1;i<=NF;i++) {total[i]+=$i ; sq[i]+=$i*$i ; } }
END {
for(i=1;i<=NF;i++) printf "%f ",total[i]/NR ;
printf "\n" ;
for(i=1;i<=NF;i++) printf "%f ",sq[i]/NR-(total[i]/NR)**2 ;
printf "\n" ;
}