根据标题拆分多个fasta文件

时间:2018-04-11 10:16:23

标签: unix awk fasta

我是生物信息学的初学者,我正在尝试从多个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。

我真的很感激帮助

2 个答案:

答案 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}}行。然后它只是将每一行打印到当前输出文件名。