根据 header 拆分 multiple-fasta 个文件

Split multiple-fasta files according to header

我是生物信息学的初学者,我正在尝试从几个 multiple-fasta 文件创建 sub-multiple fasta 文件。

所以我有数百个 fasta 文件,其中包含大量 fasta 行(带有 header 的序列)。我想根据物种名称(header 中的指示)将这个 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。

非常感谢帮助

这里是另一个例子,只是使用 "species" 作为文件名,所以应该将所有变体汇总到同一个文件中。

$ awk '/>/{close(fn); n=split([=10=],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

如果文件按名称排序并检查以前的名称,您可以最小化文件 open/close 操作,但这要简单得多...

试试这个:

find . -name '*.fas' -exec \
awk -F'[>_.]' '
NF>1 {
    close(out)
    out = $NF
    sub(/[0-9].*/,"",out)
    out =  "_" out ".out"
}
{ print >> out }
' {} \;

我为您的输出文件添加了后缀“.out”,这样您就可以将它们与“.fas”输入文件分开。更改它以满足您的需要。如果你有 GNU find,你可以在 find 到 运行 awk 的末尾使用 + 而不是 \; 来加快速度,但正如上面所写的那样,可以与任何 POSIX 工具一起使用。

上面使用 FS(由 -F 设置)将以 > 开头的每一行拆分为相关部分,然后重新组合,然后形成该行的输出文件名以及随后的所有内容,直到下 > 行。然后它只是将每一行打印到当前输出文件名。