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

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

我构建了一个文件,其中包含带有识别多个比对的通用 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 可用于计算列中值与列总值相比的百分比,但是如何通过标题分隔的对齐组来获取这些百分比?

答案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 )
}

相关内容