ファイルの特定の行の値の割合を計算する方法は?

ファイルの特定の行の値の割合を計算する方法は?

私は複数のソートを識別する汎用IDを持つヘッダーを含み、次の行にそのソートIDに対応するゲノムIDを含むファイルを構成しました。ゲノムIDに加えて、以下の例に従って、パーセンテージ値を3番目の列に追加して数値をパーセンテージに変換したいと思います。

ソースファイル:

>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の合成関数

おすすめ記事