Este script GNU awk
deve fazer o trabalho:
$ awk 'NR==1 { size=NF;$1=$1;OFS="\t";print;next }
{ for(i=2;i<=NF;i++) {id[$1]=$1; record[$1,i-1]+=$i} }
END { PROCINFO["sorted_in"]="@ind_num_asc"
for(i in id){ printf("%s\t",i);
for(j=1;j<size;j++) printf("%s\t",record[i,j]);
printf("\n");
}
} ' data.txt > out.txt
$ cat out.txt
Id a b c d e
1 6 9 12 15 18
2 15 18 21 24 27
3 34 38 42 46 50
4 23 25 27 29 31
5 27 29 31 33 35
Editar:
Aqui está uma versão que preserva a ordem das linhas originais em vez de classificar os IDs:
$ awk 'NR==1 { size=NF;$1=$1;OFS="\t";print;next }
{ if(o[$1]==0) o[$1]=NR
for(i=2;i<=NF;i++) {record[$1,i-1]+=$i} }
END { PROCINFO["sorted_in"]="@val_num_asc"
for(i in o){ printf("%s\t",i)
for(j=1;j<size;j++) printf("%s\t",record[i,j])
printf("\n") }
}'