我有一个有数千个登录号的文件:
看起来像这样..。
>NC_033829.1 Kallithea virus isolate DrosEU46_Kharkiv_2014, complete genome
AGTCAGCAACGTCGATGTGGCGTACAATTTCTTGATTACATTTTTGTTCCTAACAAAATGTTGATATACT
>NC_020414.2 Escherichia phage UAB_Phi78, complete genome
TAGGCGTGTGTCAGGTCTCTCGGCCTCGGCCTCGCCGGGATGTCCCCATAGGGTGCCTGTGGGCGCTAGG如果要将其拆分为多个文件,每个文件都有一个登录号,那么我可以使用以下代码
awk -F '|' '/^>/ {F=sprintf("%s.fasta",$2); print > F;next;} {print >> F;}' < yourfile.fa我有一个具有数千个登录号(又名>NC_*)的文件,并希望将其拆分,因为每个文件都包含大约5000个登录号。由于我对awk/bash/python还是新手,所以我很难找到一个简洁的解决方案。
如有任何意见或评论,请见谅
发布于 2021-07-27 12:39:28
从你的问题中还不清楚“登录号”是每个输入块中唯一的(不要假设阅读你的问题的人知道你的域名--对我们来说这只是一行文字)。如果你说你的问题只是说你想要每个输出文件5000个新行分隔块,而不是5000个加入号,那就更清楚了。
在看了你发布的答案之后,现在很清楚,这就是你应该使用的内容:
awk -v RS= -v ORS='\n\n' '
(NR%5000) == 1 { close(out); out="myseq"(++n_seq)".fa" }
{ print > out }
' my_sequences.fa发布于 2021-07-25 20:11:43
假设:区段由空行分隔。
算法:
Awk术语:“记录”将是我们的部分-文件的一部分,由空行分隔(即两个换行符一个接一个。“字段”通常用空格分隔--通过空格或>字符分隔,第二个字段将是登录号。
只需将记录分隔符设置为两个新行,将字段分隔符设置为>或space,然后将该行输出到以第二个字段命名的文件中:
awk -v RS='' -v FS='[> ]' '{f=($2 ".txt"); print >> f; close(f)}'@编辑将>更改为>>,RS='\n\n'更改为RS=''
@编辑并添加close
发布于 2021-07-30 14:29:51
最好使用Biopython的Bio.SeqIO来处理FASTA文件的读写。然后,您所需要的只是按需要对记录(SeqRecord对象)进行分组。我倾向于使用分组函数产生迭代器:
from itertools import chain, islice
from Bio import SeqIO
def grouper(n, iterable):
it = iter(iterable)
while True:
chunk_it = islice(it, n)
try:
first = next(chunk_it)
except StopIteration:
return
yield chain((first,), chunk_it)
for idx, group in enumerate(grouper(5000, SeqIO.parse('input.fa', 'fasta')), 1):
SeqIO.write(group, f'out-{idx}.fa', 'fasta')https://stackoverflow.com/questions/68521944
复制相似问题