Sorting 合并第二列时对第一列排序

Sorting 合并第二列时对第一列排序,sorting,unix,uniq,Sorting,Unix,Uniq,我正在寻找以下问题的解决方案。我有一个文本文件,第一列是geneIDs,第二列是GOterms。因为每个基因都有多个带注释的GOTERM,所以相同的GENEID确实会出现多次(第二列中有不同的GOTERM。我只希望合并具有GOTERM的唯一GENEID: 我有: 我想: TRINITY_DN10151_c0_g1 GO:0004175-GO:0004252-GO:0006508-GO:0008233 TRINITY_DN102626_c42_g1 GO:0005198-GO:0042302 等

我正在寻找以下问题的解决方案。我有一个文本文件,第一列是geneIDs,第二列是GOterms。因为每个基因都有多个带注释的GOTERM,所以相同的GENEID确实会出现多次(第二列中有不同的GOTERM。我只希望合并具有GOTERM的唯一GENEID: 我有:

我想:

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

此外,重要的是(我真的不知道如何解决这个问题)每个GO-term组合出现一次。因此,如果两个基因在第2列中具有相同的GO-term组合(A、B和C),那么它们都应该具有A-B-C,而不是A-C-B

我曾尝试使用sort和uniq,但最终我只是删除了行


有人能帮我一个unix解决方案吗?

你可以用一个相当隐晦的
sed
命令来完成。(每个
sed
命令都是琐碎或隐晦的。)

粗略地翻译,这表示“在这一行后面加上下一行,用连字符替换换行符和第二个基因名,只要两个基因名相同”


排序
是为了在基因间保持GOterm顺序的一致性。

我注意到我的文本格式已更改。因此,在我的每一行文件中,我现在有一个单独的基因ID和一个GO术语:TRINITY_DN10151_c0_g1 GO:0004175,但我希望合并所有具有类似基因ID的GOterm。只有一个GOterm组合o类似GOterm组合的顺序。c58发生了什么事?
c58
?您正在删除没有与任何其他输入行组合的输入行吗?这似乎还不起作用。我得到的输出与我只使用“sort Filename”得到的输出完全相同。如何将GO术语组合成子组(如上所述)?@T\R:我最好的猜测是这是一个空格问题。我假设这些是输入文件中的空格;如果它们是制表符或两者的组合,则该命令可能无法工作。请尝试
sed'N;s/\N[^]*/-/'
并报告结果(在此处,以注释的形式)。
TRINITY_DN10151_c0_g1 GO:0004175-GO:0004252-GO:0006508-GO:0008233
TRINITY_DN102626_c42_g1 GO:0005198-GO:0042302
sort filename | sed -e :a -e '$!N;s/^\([^ ]* \) *\(.*\)\n\1 */\1\2-/;ta' -e 'P;D'