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
记录数$2
x