Awk

如何計算文件特定行中值的百分比?

  • July 18, 2022

我建構了一個文件,其中包含用於標識多個比對的通用 ID 的標題,並且在下一行是與該比對 ID 對應的基因組 ID。根據下面的範例,除了基因組 ID,我還有想要轉換為百分比的數字,將百分比的值添加為第三列:

原始文件:

>對齊_1
GCA_910584205.1 13
GCA_003584705.1 7
>對齊_2
GCA_002361735.1 168
GCA_002492725.1 2880
GCA_002492725.1 2880
>對齊_3
GCA_900540295.1 165
GCA_002490525.1 125

最終文件:

>對齊_1
GCA_910584205.1 13 65%
GCA_003584705.1 7 35%
>對齊_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 可用於計算列中值與列總值相比的百分比,但是如何通過由標題分隔的對齊組獲得這些百分比?

$ 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(),請參閱roundup-function-in-unix

引用自:https://unix.stackexchange.com/questions/710154