Shell-Script

如何計算文件的列百分比?

  • April 15, 2016

我有一個包含一些值的 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";
}

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