合并第二列时对第一列进行排序

时间:2018-08-24 13:08:01

标签: sorting unix uniq

我正在寻找以下问题的解决方案。我在第一列的geneID和第二个单独的GOterms中有一个文本文件。因为每个基因都有多个带注释的GOterm,所以相同的geneID确实会出现多次(第二列中有不同的GOterm。我只想合并GOterm的唯一GeneID: 我有:

TRINITY_DN10151_c0_g1   GO:0004175
TRINITY_DN10151_c0_g1   GO:0004252
TRINITY_DN10151_c0_g1   GO:0006508
TRINITY_DN10151_c0_g1   GO:0008233
TRINITY_DN102626_c42_g1 GO:0005198
TRINITY_DN102626_c42_g1 GO:0042302
TRINITY_DN102626_c58_g1 GO:0004175

我想要:

TRINITY_DN10151_c0_g1 GO:0004175-GO:0004252-GO:0006508-GO:0008233
TRINITY_DN102626_c42_g1 GO:0005198-GO:0042302

等等。

此外,每个GO术语组合出现一次非常重要(而且我真的不知道如何解决)。因此,如果两个基因在第2列中具有相同的GO术语组合(A,B和C),则它们都应具有A-B-C。而且也不是A-C-B。

我尝试使用sort和uniq,但最后我只删除了行。

有人可以帮我解决unix解决方案吗?

1 个答案:

答案 0 :(得分:0)

您可以使用相当神秘的sed命令来完成此操作。 (每个sed命令都是微不足道的或隐晦的。)

sort filename | sed -e :a -e '$!N;s/^\([^ ]* \) *\(.*\)\n\1 */\1\2-/;ta' -e 'P;D' 

松散翻译,上面写着“ ”,“只要在这两个基因名称相同的情况下,将下一行附加到换行符和第二个基因名称之间,就用连字符替换”。

sort是要在基因之间保持GOterm顺序一致。