저는 여러 정렬을 식별하는 범용 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 )
}