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

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

我有一个包含一些值的 tsv 文件。我想要每列的总和以及值和百分比值的总数。例如:

文件.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(非数字字符)值的列中 0 和 1 的数量。

答案1

您可以使用 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";
}

相关内容