Awk

使用 AWK 計算列的均值和變異數

  • May 1, 2020

我有一個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 如下所示。第一行對應每列的平均值,第二行是變異數(基於樣本)。

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

您將需要一個循環到所有列

{ 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" ;
}

引用自:https://unix.stackexchange.com/questions/307168