この値を追加して、最初の列の共通IDに基づいて行をマージしますか?

この値を追加して、最初の列の共通IDに基づいて行をマージしますか?

タブ区切りのファイルがあります。

    Class      Sample_1     Sample_2      Sample_3
    A          0            0             0
    Z          0.25         0             0.75
    A|B|C      0            0             0
    A|B|C      0            1             0
    A|B|C      0.1875       0.671875      0.140625
    A|B|C      0.2739726027 0.5890410959  0.1369863014
    A|B|C|D|E  0            0.2           0.8
    A|B|C|D    0.1666666667 0.3333333333  0.5
    A|B|C|D    0.4723756906 0.179558011   0.3480662983

最初の列のIDに基づいて行をマージしてマージしながら値を追加したいと思います。

Class       Sample_1        Sample_2        Sample_3
A           0               0               0
Z           0.25            0               0.75
A|B|C       0.4614726027    2.2609160959    0.2776113014
A|B|C|D|E   0               0.2             0.8
A|B|C|D     0.6390423573    0.5128913443    0.8480662983

ベストアンサー1

GNU datamashの利点は次のとおりです。

$ datamash -H groupby 1 sum 2-4 < file.tsv | column -t
GroupBy(Class)  sum(Sample_1)  sum(Sample_2)  sum(Sample_3)
A               0              0              0
Z               0.25           0              0.75
A|B|C           0.4614726027   2.2609160959   0.2776113014
A|B|C|D|E       0              0.2            0.8
A|B|C|D         0.6390423573   0.5128913443   0.8480662983

または、GNU awkで2D配列を使用します(配列の巡回順序は保証されていないため、出力ラインは必ずしも入力と同じ順序である必要はありません)。

$ gawk '
    BEGIN{getline; print} 
    {for(i=2;i<=4;i++) a[$1][i] += $i} 
    END {
      for(k in a){printf k; for(i=2;i<=4;i++) printf "\t%s", a[k][i]; printf "\n"}
    }' file.tsv | column -t
Class      Sample_1  Sample_2  Sample_3
A          0         0         0
A|B|C      0.461473  2.26092   0.277611
A|B|C|D    0.639042  0.512891  0.848066
A|B|C|D|E  0         0.2       0.8
Z          0.25      0         0.75

column -t注:視覚的な書式設定のためにパイプを追加しました。

おすすめ記事