Como faço para calcular a porcentagem de coluna de um arquivo?

0

Eu tenho um arquivo tsv que contém alguns valores. Eu quero a soma de cada coluna e número total de valores e valores percentuais. Por exemplo:

file.tsv contém

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

(o arquivo tsv contém mais de 4 linhas)

resultado:

        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

Eu usei um script sed para calcular o número de um e zero, mas isso não foi anexado ao final do arquivo. E na soma resultante representa a adição de '1' presente na coluna, total é o número de zero e um na coluna ignorando o valor de x (caracter não numérico).

    
por Pradyumna Sagar 15.04.2016 / 10:38

1 resposta

2

Você pode fazer isso com o awk, mantendo o controle de colunas numéricas versus não numéricas e resumindo no final:

#!/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";
}
    
por 15.04.2016 / 10:59