如何在相同的multiFASTA文件中连接序列,然后将结果打印到新的FASTA文件?

2024-10-02 16:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件夹,其中包含50多个FASTA文件,每个文件中包含2-8个FASTA序列,下面是一个示例:


    testFOR.id_AH004930.fasta

>AH004930|2:1-128_Miopithecus_talapoin
ATGA
>AH004930|2:237-401_Miopithecus_talapoin
GGGT
>AH004930|2:502-580_Miopithecus_talapoin
CTTTGCT
>AH004930|2:681-747_Miopithecus_talapoin
GGTG

    testFOR.id_M95099.fasta

>M95099|1:1-90_Homo_sapien
TCTTTGC
>M95099|1:100-243_Homo_sapien
ATGGTCTTTGAA

它们都是根据它们的ID号(在本例中是AH004930和M95099)进行分组的,我使用非常方便的seqkit代码HERE从原始的multifsata文件中提取了ID号

我的目标是:

  1. 使用cat将这些序列放在文件中,如下所示:
>AH004930|2:1-128_Miopithecus_talapoin
ATGAGGGTCTTTGCTGGTG

>M95099|1:1-90_Homo_sapien
TCTTTGCATGGTCTTTGAA

(我不在乎核苷酸的位置,我只在乎ID和物种名称!)

  1. 将此结果打印到新的FASTA文件中

理想情况下,我真的希望将所有这50个文件压缩成1个FASTA,然后我可以继续进行筛选/对齐:


    GENE_L.fasta

>AH004930|2:1-128_Miopithecus_talapoin
ATGAGGGTCTTTGCTGGTG
>M95099|1:1-90_Homo_sapien
TCTTTGCATGGTCTTTGAA
....

到目前为止,我已经找到了一种方法来实现我想要的,但一次只能实现一个文件(使用这个代码:cat myfile.fasta | sed -e '1!{/^>.*/d;}' | sed ':a;N;$!ba;s/\n//2g' > output.fasta,我很遗憾地失去了信用卡的链接),但是这些文件名中有很多非常相似,所以如果我手动执行,不可避免地会错过一些文件/速度太慢

我试着把它放进一个循环,它就在那里!但它所做的是将每个FASTA文件进行压缩,将其放入一个新文件中,但只保留第一个标题,给我留下大量的缝合序列

for FILE in *; do cat *.fasta| sed -e '1!{/^>.*/d;}'| sed ':a;N;$!ba;s/\n//2g' > output.fasta; done
 

    output.fasta

>AH004930|2:1-128_Miopithecus_talapoin
ATGAGGGTCTTTGCTGGTGTCTTTGCATGGTCTTTGAAGGTCTTTGAAATGAGTGGT...

我想知道做一个类似于HERE的循环是否有好处,但我真的不确定如何让它在打开一个新文件后打印每个头

我怎样才能对这些序列进行分类,将它们打印到新文件中,并且仍然保留这些标题? 我真的很感激任何关于我在循环中哪里出错的建议,以及任何适合zsh shell的解决方案!我对任何python或linux解决方案都持开放态度。先谢谢你


Tags: 文件idoutput序列sedfastacathomo
2条回答

我不确定我是否完全理解您的问题,但如果您只是想将多个文件中的内容连接到一个文件中,我相信下面的(Python)代码应该可以工作:

import os

input_folder = 'path/to/your/folder/with/fasta/files'
output_file = 'output.fasta'

with open(output_file, 'w') as outfile:
    for file_name in os.listdir(input_folder):
        if not file_name.endswith('.fasta'):  # ignore this
            continue
        file_path = os.path.join(input_folder, file_name)
        with open(file_path, 'r') as inpfile:
            outfile.write(inpfile.read())

这可能适用于您(GNU-sed):

sed -s '1h;/>/d;H;$!d;x;s/\n//2g' file1 file2 file3 ...

-s设置为分别处理每个文件

复制第一行

删除包含>的任何其他行

将所有其他行附加到第一行

删除除最后一行之外的这些行

在文件末尾,切换到副本并删除除第一行以外的所有换行符

对所有文件重复此操作


非GNU SED的替代方案:

for file in *.fasta; do sed '1h;/>/d;H;$!d;x;s/\n//2g' "$file"; done

注意:MacOS sed可能需要放在脚本中,并使用-f选项调用,或者使用-e选项(减去;命令)将其拆分为多个部分,您的运气可能会有所不同

或许:

for file in file?; do sed $'1h;/>/d;H;$!d;x;s/\\n/@/;s/\\n//g;s/@/\\n/' "$file"; done

相关问题 更多 >