全プログラム

全プログラム

dataset.csv7つの数値列を含む大容量データファイルがあります。 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レコードの数です。$2x

関連情報