我正在尝试使用之前发布在该论坛上的 AWK 脚本。我正在尝试将包含多个 DNA 序列的大型 FASTA 文件拆分为单独的 FASTA 文件。我需要将每个序列分离到它自己的 FASTA 文件中,每个新的 FASTA 文件的名称需要是原始大型 multifasta 文件中的 DNA 序列的名称(> 之后的所有字符)。
我尝试了我在 stackoverflow 上找到的这个脚本:
awk '/^>chr/ {OUT=substr($0,2) ".fa"}; OUT {print >OUT}' your_input
效果很好,但 DNA 序列直接在文件名之后开始——没有空格。 DNA 序列需要从一个新行开始(常规 FASTA 格式)。
如果能帮我解决这个问题,我将不胜感激。 谢谢!
你的意思是这样的吗?
awk '/^>chr/ {OUT=substr($0,2) ".fa";print " ">OUT}; OUT{print >OUT}' your_input
为每个“染色体/序列/事物”创建的新文件在哪里开始时有一个空行?
我认为这应该有效。
awk '/^>chr/ {OUT=substr($0,2) ".fa"}; {print >> OUT; close(OUT)}' Input_File
希望这个 perl 脚本能有所帮助。
#!/usr/bin/perl
open (INFILE, "< your_input.fa")
or die "Can't open file";
while (<INFILE>) {
$line = $_;
chomp $line;
if ($line =~ /\>/) { #if has fasta >
close OUTFILE;
$new_file = substr($line,1);
$new_file .= ".fa";
open (OUTFILE, ">$new_file")
or die "Can't open: $new_file $!";
}
print OUTFILE "$line\n";
}
close OUTFILE;
.fa(或 .fasta)格式如下:
>ID1
序列
>ID2
序列
拆分 fasta 文件时,实际上不希望在其顶部插入换行符。因此Pramod的回答更为恰当。此外,可以更一般地定义 ID 以仅匹配
>
字符。因此,完整的行将是:
awk '/^>/ {OUT=substr($0,2) ".fa"}; {print >> OUT; close(OUT)}' Input_File
如果您不想将所有拆分文件弄乱当前目录,您还可以输出到子目录中 (
subdir
):
awk '/^>/ {OUT="subdir/" substr($0,2) ".fa"}; {print >> OUT; close(OUT)}' Input_File
awk
将多序列 fasta 文件拆分为单独的序列文件这个问题最好通过考虑每个序列(完整的标题)一个单一的
record
和改变awk
的默认记录分隔符RS
(通常是一个换行符)是唯一的(每个记录一个)>
用于定义标题开始的符号。由于我们希望使用标题文本作为文件名,并且由于 fasta 标题不能包含换行符,因此将 awk
的默认字段分隔符或 FS
(通常为空白)重置为换行符也很方便.
这两个都是在一个
awk
BEGIN
块中完成的:
BEGIN{RS=">";FS="\n"}
由于文件以
>
开头,第一条记录将为空,因此必须忽略,以防止尝试写入从空记录中提取的文件名而导致的错误。因此,主要 awk
操作块被过滤为仅处理以记录号 (NR
) 2 开头的记录。这是通过在操作块之前放置一个条件来实现的,如下所示:
NR>1{ ... }
记录分隔符设置为
>
每条记录都是一个完整的序列,包括它的标题,每条记录在换行符处被分成字段(因为我们将字段分隔符设置为“
")。因此,每条记录的字段 1 ($1
) 包含我们希望用作文件名的文本。注意记录分隔符 (>) 不再是任何字段的一部分,因此整个第一个字段可用于构建文件名。在此示例中,“.fasta”已附加为文件扩展名:
fnme=$1 ".fasta";
接下来,打印 fasta 标头标记“>”,然后是整个记录(
$0
)到刚刚形成的文件名fnme
,使用awk
的>
重定向:
print ">" $0 > fnme;
最后,关闭文件以防止 awk 超过允许打开文件数的系统限制,如果要写入许多文件(参见脚注):
close(fnme);
awk 命令
awk 'BEGIN{RS=">";FS="\n"} NR>1{fnme=$1".fasta"; print ">" $0 > fnme; close(fnme);}' example.fasta
在以下名为example.fasta
的模拟文件上测试:
>DNA sequence 1
GCAAAAGAACCGCCGCCACTGGTCGTGAAAGTGGTCGATCCAGTGACATCCCAGGTGTTGTTAAATTGAT
CATGGGCAGTGGCGGTGTAGGCTTGAGTACTGGCTACAACAACACTCGCACTACCCGGAGTGATAGTAAT
GCCGGTGGCGGTACCATGTACGGTGGTGAAGT
>DNA sequence 2
TCCCAGCCAGCAGGTAGGGTCAAAACATGCAAGCCGGTGGCGATTCCGCCGACAGCATTCTCTGTAATTA
ATTGCTACCAGCGCGATTGGCGCCGCGACCAGGATCCTTTTTAACCATTTCAGAAAACCATTTGAGTCCA
TTTGAACCTCCATCTTTGTTC
>DNA sequence 3
AACAAAAGAATTAGAGATATTTAACTCCACATTATTAAACTTGTCAATAACTATTTTTAACTTACCAGAA
AATTTCAGAATCGTTGCGAAAAATCTTGGGTATATTCAACACTGCCTGTATAACGAAACACAATAGTACT
TTAGGCTAACTAAGAAAAAACTTT
results(终端命令和输出)
$ ls
'DNA sequence 1.fasta' 'DNA sequence 3.fasta'
'DNA sequence 2.fasta' example.fasta
$ cat DNA\ sequence\ 1.fasta
>DNA sequence 1
GCAAAAGAACCGCCGCCACTGGTCGTGAAAGTGGTCGATCCAGTGACATCCCAGGTGTTGTTAAATTGAT
CATGGGCAGTGGCGGTGTAGGCTTGAGTACTGGCTACAACAACACTCGCACTACCCGGAGTGATAGTAAT
GCCGGTGGCGGTACCATGTACGGTGGTGAAGT
$ cat DNA\ sequence\ 2.fasta
>DNA sequence 2
TCCCAGCCAGCAGGTAGGGTCAAAACATGCAAGCCGGTGGCGATTCCGCCGACAGCATTCTCTGTAATTA
ATTGCTACCAGCGCGATTGGCGCCGCGACCAGGATCCTTTTTAACCATTTCAGAAAACCATTTGAGTCCA
TTTGAACCTCCATCTTTGTTC
$ cat DNA\ sequence\ 3.fasta
>DNA sequence 3
AACAAAAGAATTAGAGATATTTAACTCCACATTATTAAACTTGTCAATAACTATTTTTAACTTACCAGAA
AATTTCAGAATCGTTGCGAAAAATCTTGGGTATATTCAACACTGCCTGTATAACGAAACACAATAGTACT
TTAGGCTAACTAAGAAAAAACTTT
脚注
“在同一个 awk 程序中连续写入大量文件。如果文件没有关闭,awk 最终可能会超过系统对一个进程中打开的文件数的限制。最好在每个进程关闭时关闭每个文件程序写完了。”
引自https://www.gnu.org/software/gawk/manual/html_node/Close-Files-And-Pipes.html