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

How to concatenate sequences in the same multiFASTA files and then print result to a new FASTA file?

我有一个包含 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 代码从原始的原始 multiFASTA 文件中提取了这些 ID HERE

我的目标是:

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

>M95099|1:1-90_Homo_sapien
TCTTTGCATGGTCTTTGAA

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

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

理想情况下,我真的很想将所有这 50 个文件压缩成 1 个 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,我遗憾地失去了 link 的功劳) 但很多文件名都非常相似,所以如果我手动完成,我不可避免地会错过 some/it 太慢了。

我试过将它放入一个循环中,它有点!但它所做的是它对每个 FASTA 文件进行分类,将其放入一个新文件中但只保留第一个 header,给我留下大量缝合在一起的序列;

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 的循环会有什么好处,但我真的不确定如何让它在打开新文件后打印每个 header。

我如何整理这些序列,将它们打印到新文件中并仍然保留这些 header? 我真的很感激任何关于我在循环中哪里出错的建议以及任何适合 zsh shell 的解决方案!我对任何 python 或 linux 解决方案持开放态度。提前谢谢你

不确定我是否完全理解您的问题,但如果您只是想将多个文件的内容连接到一个文件中,我相信下面的 (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 seds 的替代方案:

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

N.B。 MacOS sed 可能需要放入脚本中并使用 -f 选项调用或使用 -e 选项分成几部分(减去 ; 命令),你的运气可能会有所不同。

或者也许:

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