Shell-Script
如何計算文件的列百分比?
我有一個包含一些值的 tsv 文件。我想要每列的總和以及值和百分比值的總數。例如:
file.tsv 包含
x 1 1 0 1 x x 1 x 1 1 x 0 0 x 1 x 0 0 0 x 1 1 x 1 1 x 0 x x x 1 x x x 1
(tsv 文件包含超過 4 行)
結果:
x 1 1 0 1 x x 1 x 1 1 x 0 0 x 1 x 0 0 0 x 1 1 x 1 1 x 0 x x x 1 x x x 1 sum 1 2 1 1 3 0 2 2 1 total 3 3 1 3 4 0 2 2 2 percent 33 66 100 33 75 0 100 100 50
我使用 sed 腳本來計算 1 和 0 的數量,但它沒有附加到文件末尾。並且在結果 sum 表示在列中加上“1”,total 是忽略
x
(非數字字元)的值的列中零和一的數量。
您可以使用 awk 執行此操作,跟踪數字列與非數字列並在最後進行匯總:
#!/usr/bin/awk -f BEGIN { width = 0; } { if (width < NF) width = NF; for (n = 1; n <= NF; ++n) { if ( $n ~ /^[0-9]+$/ ) { number[n] += $n; total[n] += 1; } else { others[n] += $n; } } print; next; } END { printf "sum"; for (n = 1; n <= width; ++n) { printf "%5d", number[n]; } printf "\n"; printf "total"; for (n = 1; n <= width; ++n) { printf "%5d", total[n]; } printf "\n"; printf "percent"; for (n = 1; n <= width; ++n) { if ( total[n] != 0) { printf "%5d", 100 * number[n] / total[n]; } else { printf "%5d", 0; } } printf "\n"; }