タブ区切りのファイルがあります。
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
注:視覚的な書式設定のためにパイプを追加しました。