如果你不介意订单(GNU awk):
awk -F'[, ]*' '{for (i=2;i<=NF;i++) if($i!="")a[$1][$i]}END{for(k in a){printf "%s ", k; for(j in a[k]) printf "%s,", j;print ""}} ' file >TRINITY_DN100377_c0_g1 GO:0046556,GO:0009044,GO:0045493, >TRINITY_DN10038_c0_g1 GO:0004581,GO:0005783,GO:0004598,GO:0016021,GO:0005789,
如果你想删除最后一个 , :
,
awk -F'[, ]*' '{for (i=2;i<=NF;i++) if($i!="")a[$1][$i]}END{for(k in a){e=sprintf("%s ", k); for(j in a[k]) e=e sprintf("%s,", j);sub(/.$/,"",e);print e}} ' file >TRINITY_DN100377_c0_g1 GO:0046556,GO:0009044,GO:0045493 >TRINITY_DN10038_c0_g1 GO:0004581,GO:0005783,GO:0004598,GO:0016021,GO:0005789