파일의 열 비율을 계산하는 방법은 무엇입니까?

파일의 열 비율을 계산하는 방법은 무엇입니까?

일부 값이 포함된 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";
}

관련 정보