【问题标题】:Multiple sequence alignment. Convert multi-line format to single-line format?多序列比对。将多行格式转换为单行格式?
【发布时间】:2015-05-08 13:32:36
【问题描述】:

我有一个多序列比对文件,其中散布着来自不同序列的行,就像 clustal 和其他流行的多序列比对工具输出的格式一样。它看起来像这样:

TGFb3_human_used_for_docking        ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPY
tr|B3KVH9|B3KVH9_HUMAN              ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPY
tr|G3UBH9|G3UBH9_LOXAF              ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPY
tr|G3WTJ4|G3WTJ4_SARHA              ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPY


TGFb3_human_used_for_docking        LRSADTTHST-
tr|B3KVH9|B3KVH9_HUMAN              LRSADTTHST-
tr|G3UBH9|G3UBH9_LOXAF              LRSTDTTHST-
tr|G3WTJ4|G3WTJ4_SARHA              LRSADTTHST-

每一行都以一个序列标识符开始,然后是一个字符序列(在这种情况下描述蛋白质的氨基酸序列)。每个序列分为几行,因此您会看到第一个序列(ID 为TGFb3_human_used_for_docking)有两行。我想将其转换为每个序列都有一行的格式,如下所示:

TGFb3_human_used_for_docking        ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPYLRSADTTHST-
tr|B3KVH9|B3KVH9_HUMAN              ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPYLRSADTTHST-
tr|G3UBH9|G3UBH9_LOXAF              ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPYLRSTDTTHST-
tr|G3WTJ4|G3WTJ4_SARHA              ALDTNYCFRNLEENCCVRPLYIDFRQDLGWKWVHEPKGYYANFCSGPCPYLRSADTTHST-      

(在这个特定的例子中,序列几乎是相同的,但通常它们不是!)

如何将多行多序列比对格式转换为单行?

【问题讨论】:

  • 如果你不想乱写脚本,你可以在对齐编辑器中打开文件(我推荐 aliview)并保存为 phylip 格式(宽松,非交错)。
  • 请注意。我编写了将aln文件转换为一行的代码,发现如果行太长,很多读取aln文件的软件会崩溃或冻结。某些软件似乎使用 2000bp 缓冲区。
  • 非脚本编辑器专用解决方案:在vim 中打开它。转到第二组读取的开始。点击Ctrl V(即两个键同时用于视觉块模式)。移动光标以突出显示序列块。点击x(即切块)。转到第一个序列块的末尾。点击p(即粘贴块)。对剩余的块重复。一旦你在一行中得到了所有的序列,就去你最后一个序列之后的那一行。点击d 然后G 删除到文件末尾。点击: 然后w 然后q 然后Enter 写入(保存)并退出。

标签: bioinformatics sequence-alignment


【解决方案1】:

看起来您需要编写某种脚本来实现这一点。这是我用 Python 编写的一个简单示例。它不会像您的示例中那样漂亮地排列空白(如果您关心这一点,您将不得不与formatting 混在一起),但它完成了其余的工作

#Create a dictionary to accumulate full sequences
full_sequences = {}

#Loop through original file (replace test.txt with your file name)
#and add each line to the appropriate dictionary entry
with open("test.txt") as infile:
    for line in infile:
        line = [element.strip() for element in line.split()]
        if len(line) < 2:
            continue
        full_sequences[line[0]] = full_sequences.get(line[0], "") + line[1]

#Now loop through the dictionary and write each entry as a single line
outstr = ""
with open("test.txt", "w") as outfile:
    for seq in full_sequences:
        outstr += seq + "\t\t" + full_sequences[seq] + "\n"

    outfile.write(outstr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2022-07-24
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多