将multifasta文件拆分为具有相同访问编号的文件

2024-09-30 18:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含数千个登录号的文件:

看起来像这样

>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

我有一个包含数千个登录号(aka>;NC_*)的文件,并希望将其拆分,例如每个文件包含约5000个登录号。因为我是awk/bash/python新手,所以我很难找到一个简洁的解决方案

任何想法或意见都将不胜感激


Tags: 文件genomecompleteprintncawkisolatekallithea
3条回答

非常感谢你的回答,我学到了很多。我真正想做的是将multifasta文件拆分为具有相同登录号的文件。经过一场漫长的战斗,在一位同事的帮助下,以下是我的答案

awk 'BEGIN {n_seq=0;} /^>/ {if(n_seq%5000==0){file=sprintf("myseq%d.fa",n_seq);} print >> file; n_seq++; next;} { print >> file; }' < my_sequences.fa

在这里,您可以创建新的fasta文件,其中每个文件都有5000个登录号或标题

谢谢大家

从您的问题中不清楚“登录号”在每个输入块中是唯一的(不要假设阅读您问题的人对您的域有任何了解-对我们来说,这只是一行行文字)。如果您将问题措辞为每个输出文件只需要5000个新行分隔块,而不是5000个登录号,则会更清楚

看到您发布的答案后,现在很清楚您应该使用以下内容:

awk -v RS= -v ORS='\n\n' '
    (NR%5000) == 1 { close(out); out="myseq"(++n_seq)".fa" }
    { print > out }
' my_sequences.fa

假设:部分由空行分隔

算法:

  • 在节上拆分文件
  • 从节中提取登录号
  • 将节输出到以登录号命名的文件名

Awk术语:“记录”将是我们的节-文件的一部分,用空行分隔(即两个换行符一个接一个。“字段”通常用空格分隔-用空格分隔>字符第二个字段将是登录号

只需将记录分隔符设置为两个换行符,将字段分隔符设置为>或空格,然后将该行输出到名为with second field的文件:

awk -v RS='' -v FS='[> ]' '{f=($2 ".txt"); print >> f; close(f)}'

@edit将>更改为>>,将RS='\n\n'更改为RS=''

@edit并添加了close

相关问题 更多 >