
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" ;
}
答え2
「C」方法、文書。おそらく効率的でも清潔でもありませんが、読みやすくなります。 NxM スペースで区切られた要素を含むデータファイルの各列の平均と分散を計算します。
#!/bin/awk -f
BEGIN { } {
if (max_nf < NF)
max_nf = NF
max_nr = NR
for (x = 1; x <= NF; x++)
mat[x, NR] = $x
} END {
for (x = 1; x <= max_nf; x++) {
mean = 0.0
var = 0.0
for (y = 1; y <= max_nr; y++) {
var += (y - 1) * (mat[x, y] - mean) * (mat[x, y] - mean) / y
mean += (mat[x, y] - mean) / y
}
printf("%f %f\n", mean, var / (max_nr - 1))
}
}
例を実行してください:
./ColVarAndMean.awk dataset.csv > output.dat && cat output.dat
1.625000 0.839286
1.625000 1.410714
12.000000 0.285714
4.500000 6.000000
0.250000 0.214286
0.375000 0.553571
478791.500000 174812449479.714294
答え3
awk -F ',' '{print;x+=$2}END{print "MEAN" x/NR}' filename.csv
2番目の列は、$2
変数に値を格納できるNR
レコードの数です。$2
x