【问题标题】:Sort first column while merging second column合并第二列时对第一列进行排序
【发布时间】:2018-08-24 13:08:00
【问题描述】:

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

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 解决方案吗?

【问题讨论】:

  • 我注意到我的文本格式发生了变化。因此,在我的每一行文件中,我现在有一个带有单个 GO 术语的单个基因 ID:TRINITY_DN10151_c0_g1 GO:0004175 但我希望合并所有具有相似基因 ID 的 GOterm。类似的 GOterm 组合只有一个 GOterm 组合顺序。
  • c58 发生了什么?您是否删除了不与任何其他输入行组合的输入行?

标签: sorting unix uniq


【解决方案1】:

你可以用一个相当神秘的sed 命令来做到这一点。 (每个sed 命令都是微不足道的或神秘的。)

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

粗略的翻译,这就是 “将下一行附加到这一行,并用连字符替换换行符和第二个基因名称,只要两个基因名称相同”。

sort 是为了保持基因间的GOterm 顺序一致。

【讨论】:

  • 这似乎还不行。我得到的输出与我只使用“排序文件名”完全相同。如何将 GO 术语组合成子组(如上)?
  • @T_R:我最好的猜测是这是一个空白问题。我假设那些是您输入文件中的 空格 ;如果它们是 选项卡, 或两者的某种组合,则该命令可能不起作用。尝试sed 'N;s/\n[^ ]* /-/' 并报告结果(在此处,在评论中)。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 2012-06-29
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多