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



我有一个文件夹,里面有超过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),我已经设法从原始的原始multiFASTA文件中提取了使用这里找到的非常方便的seqkit代码。

我的目标是:

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

(我不担心核苷酸的位置,我担心的是ID和物种名!)

  • 这个结果打印出来到一个新的FASTA文件。
  • 理想情况下,我真的希望将所有这50个文件压缩到一个FASTA中,然后我可以继续点击filter/align:

    
    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...
    

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

    我怎么能cat这些序列,打印到一个新的文件,仍然保持这些头?我非常感谢任何关于我在循环中哪里出错的建议和任何适合zsh shell的解决方案!我对任何python或linux解决方案都持开放态度。谢谢你的好意

    这可能适合您(GNU sed):

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

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

    复制第一行。

    删除其他包含>的行。

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

    删除除最后一行外的其余行。

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

    对所有文件重复此操作。


    非gnu种子的替代方案:

    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
    

    我不确定我完全理解你的问题,但如果你只是想将许多文件的内容连接到一个文件,我相信下面的(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())
    

    最新更新