파일의 특정 줄에 있는 값의 백분율을 계산하는 방법은 무엇입니까?

파일의 특정 줄에 있는 값의 백분율을 계산하는 방법은 무엇입니까?

저는 여러 정렬을 식별하는 범용 ID가 있는 헤더를 포함하고 다음 줄에 해당 정렬 ID에 해당하는 게놈 ID가 포함된 파일을 구성했습니다. 게놈 ID 외에도 아래 예에 따라 백분율 값을 세 번째 열로 추가하여 숫자를 백분율로 변환하고 싶습니다.

원본 파일:

>align_1
GCA_910584205.1 13
GCA_003584705.1 7
>align_2
GCA_002361735.1 168
GCA_002492725.1 2880
GCA_002492725.1 2880
>정렬_3
GCA_900540295.1 165
GCA_002490525.1 125

최종 문서:

>align_1
GCA_910584205.1 13 65%
GCA_003584705.1 7 35%
>align_2
GCA_002361735.1 168 3%
GCA_002492725.1 2880 49%
GCA_002492725.1 2880 49%
>정렬_3
GCA_900540295.1 165 57%
GCA_002490525.1 125 43%

awk를 사용하여 열의 전체 값과 비교하여 열 값의 백분율을 계산할 수 있다는 것을 알고 있지만 헤더로 구분된 정렬 그룹을 사용하여 이러한 백분율을 어떻게 얻을 수 있습니까?

답변1

$ cat tst.awk
/>/ {
    if ( NR>1 ) {
        prt()
    }
    key = $0
    cnt = tot = 0
    next
}
{
    ids[++cnt] = $1
    vals[cnt]  = $2
    tot += $2
}
END { prt() }

function prt(           i) {
    print key
    for ( i=1; i<=cnt; i++ ) {
        print ids[i], vals[i], ceil( (tot ? vals[i] / tot : 0) * 100 )"%"
    }
}

function ceil(x,        y) {
    y = int(x)
    return ( x>y ? y+1 : y )
}

$ awk -f tst.awk file
>Alignment_1
GCA_910584205.1 13 65%
GCA_003584705.1 7 35%
>Alignment_2
GCA_002361735.1 168 3%
GCA_002492725.1 2880 49%
GCA_002492725.1 2880 49%
>Alignment_3
GCA_900540295.1 165 57%
GCA_002490525.1 125 44%

자세한 내용은 ceil()다음을 참조하세요.Unix의 합성 함수.

답변2

@Ed Morton 정말 감사합니다! 실제로 저는 이 숫자를 원래 형식(반올림하거나 100 + "%"를 곱하지 않음)으로 가져오는 것이 더 낫다는 것을 깨달았고 최종 버전의 코드를 만들었습니다.

$ cat tst.awk
/>/ {
    if ( NR>1 ) {
        prt()
    }
    key = $0
    cnt = tot = 0
    next
}
{
    ids[++cnt] = $1
    vals[cnt]  = $2
    tot += $2
}
END { prt() }

function prt(           i) {
    print key
    for ( i=1; i<=cnt; i++ ) {
        print ids[i], vals[i], ceil( (tot ? vals[i] / tot : 0) * 100 )"%"
    }
}

function ceil(x,        y) {
    y = int(x)
    return ( x>y ? y+1 : y )
}

관련 정보