完整的节目

完整的节目

dataset.csv我有一个包含 7 个数字列的大型数据文件。我读过 AWK 将是计算每列均值和方差的最快/有效的方法。我需要一个 AWK 命令来遍历 CSV 文件并将结果输出到摘要 CSV 中。示例数据集:

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 如下所示。第一行对应于每列的平均值,第二行是方差(基于样本)。

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是第二列,是我们可以将值存储到变量的NR记录数$2x

相关内容