我是生物信息学的初学者,我正在尝试从多个fast-fasta文件创建子多个fasta文件。
所以我有数百个包含fasta线的hundreads的fasta文件(带有标题的序列)。我想根据物种名称(标题中的指示)将这个fasta分成不同的新fasta文件。
我有这样的文件: CL0073reads.fas
>>CL0073reads.fas_ang4836665r
TAGGCAGGCGTGGGGGTTTGT
>CL0073reads.fas_ang4864845r
CCTCTTCGGCCCTCA
>CL0073reads.fas_atl679495r
CAAGGACCGTTAGGGGC
>CL0073reads.fas_alb178305r
GCTGACGGCAACGTTAG
我想: CL0073reads_ang.fas
`>CL0073reads.fas_ang4836665r
TAGGCAGGCGTGGGGGTTTGT
>CL0073reads.fas_ang4864845r
CCTCTTCGGCCCTCA`
CL0073reads_atl.fas
`>CL0073reads.fas_atl679495r
CAAGGACCGTTAGGGGC`
CL0073reads_abl.fas
`>CL0073reads.fas_alb178305r
GCTGACGGCAACGTTAG`
我尝试在脚本中使用awk执行此操作,以便能够通过for Fas in ${$(find *.fas)}; do awk script.awk<${Fas}
我成功将我的序列转换为一行fasta。
我真的很感激帮助
答案 0 :(得分:1)
这是另一种看法,只是使用&#34;物种&#34;作为文件名,所以应聚合同一文件中的所有变体。
$ awk '/>/{close(fn); n=split($0,a,"_|[0-9]+"); fn=a[n-1]} {print >> fn}' file
==> alb <==
>CL0073reads.fas_alb178305r
GCTGACGGCAACGTTAG
==> ang <==
>CL0073reads.fas_ang4836665r
TAGGCAGGCGTGGGGGTTTGT
>CL0073reads.fas_ang4864845r
CCTCTTCGGCCCTCA
==> atl <==
>CL0073reads.fas_atl679495r
CAAGGACCGTTAGGGGC
如果文件按名称排序并检查以前的名称,您可以最小化文件打开/关闭操作,但这更简单...
答案 1 :(得分:1)
试试这个:
find . -name '*.fas' -exec \
awk -F'[>_.]' '
NF>1 {
close(out)
out = $NF
sub(/[0-9].*/,"",out)
out = $2 "_" out ".out"
}
{ print >> out }
' {} \;
我将输出文件“.out”加后缀,以便将它们与“.fas”输入文件分开。改变它以满足您的需求。您可以在+
的末尾使用\;
而不是find
来一次在多个文件上运行awk,以便在您使用GNU查找时加快速度,但是以上将适用于任何POSIX工具。
以上使用FS(由-F设置)将以>
开头的每一行拆分成相关部分,然后重新组合,然后形成该行的输出文件名,以及下一行的所有内容{ {1}}行。然后它只是将每一行打印到当前输出文件名。