根据 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 设置)将以 >
开头的每一行拆分为相关部分,然后重新组合,然后形成该行的输出文件名以及随后的所有内容,直到下 >
行。然后它只是将每一行打印到当前输出文件名。
我是生物信息学的初学者,我正在尝试从几个 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 设置)将以 >
开头的每一行拆分为相关部分,然后重新组合,然后形成该行的输出文件名以及随后的所有内容,直到下 >
行。然后它只是将每一行打印到当前输出文件名。