如何连接同一个 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。
我的目标是:
- 使用
cat
将这些序列放在文件中,如下所示:
>AH004930|2:1-128_Miopithecus_talapoin
ATGAGGGTCTTTGCTGGTG
>M95099|1:1-90_Homo_sapien
TCTTTGCATGGTCTTTGAA
(我不在乎核苷酸位置,我在乎ID和种名!)
- 将此结果打印到新的 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
我有一个包含 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。
我的目标是:
- 使用
cat
将这些序列放在文件中,如下所示:
>AH004930|2:1-128_Miopithecus_talapoin
ATGAGGGTCTTTGCTGGTG
>M95099|1:1-90_Homo_sapien
TCTTTGCATGGTCTTTGAA
(我不在乎核苷酸位置,我在乎ID和种名!)
- 将此结果打印到新的 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