我有一个文件夹,里面有超过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代码。
我的目标是:
- 使用
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())