ファイルの列の割合を計算する方法は?

ファイルの列の割合を計算する方法は?

いくつかの値を含む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";
}

関連情報