bash: 变换脚手架fasta
bash: transform scaffold fasta
我有一个包含以下序列的 fasta 文件:
>NZ_OCNF01123018.1
TACAAATACAACAAATACAAGTACACCAAGTACAAATACAAGTATCCCAAGTACAAATACAAGTA
TCCCAAGTACAAATACAAGTATTCCAAGTACAAATACAAAACCTGTTGAGCAACCTAAACCTGTTGAAC
AGCCCAAACCTGTTGAACAGCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAACCTTTATCCGCACTTA
CGAGCAAATACACCAATACCGCTTTATCGGCACAGTCTGCCCAAATTGACGGATGCACCATGTTACCCAACAC
ATCAATCAACGTTTGTGGGATCACCTGAAAAAGGGCGCGGTTTGTGGTTGATG
>NZ_OCNF01123018.2
AATTGTCGTGTAAAGCCACACCAAACCCCATTATAGCCCCAAAAACACCAAAAAGGCTGCCTGAACCACATTTCAGACAG
我想将文件中包含多个 N
的所有序列在它出现的位置拆分,并从中生成两个序列。
预期解决方案:
>NZ_OCNF01123018.1
TACAAATACAACAAATACAAGTACACCAAGTACAAATACAAGTATCCCAAGTACAAATACAAGTA
TCCCAAGTACAAATACAAGTATTCCAAGTACAAATACAAAACCTGTTGAGCAACCTAAACCTGTTGAAC
AGCCCAAACCTGTTGAACAGC
>contig1
AAACCTTTATCCGCACTTA
CGAGCAAATACACCAATACCGCTTTATCGGCACAGTCTGCCCAAATTGACGGATGCACCATGTTACCCAACAC
ATCAATCAACGTTTGTGGGATCACCTGAAAAAGGGCGCGGTTTGTGGTTGATG
>NZ_OCNF01123018.2
AATTGTCGTGTAAAGCCACACCAAACCCCATTATAGCCCCAAAAACACCAAAAAGGCTGCCTGAACCACATTTCAGACAG
我的(不优雅的)方法是这样的:
perl -pe 's/[N]+/\*/g' $file | perl -pe 's/\*/\n>contig1\n/g'
当然这也替换了序列头的 N
并创建没有序列的头。另外,最好将新的 'contigs' 从 1 编号到 x,以防有多个带有 N
的序列。
你有什么建议?
我稍微扩展了你的 perl 一行代码:
cat file.fasta | \
perl -pe 's/\n//g unless /^>/; s/>/\n>/g;' | \
perl -pe 's/N+(?{$n++})/\n>contig${n}\n/g unless /^>/'
第一部分是去掉碱基之间的换行,第二部分是替换连续的'N'。
我建议使用 split
而不是试图让正则表达式 只是 正确,并且在脚本中而不是脆弱和拥挤的 "one"-班轮。
use warnings;
use strict;
use feature 'say';
my $file = shift @ARGV;
die "Usage: [=10=] filename\n" if !$file; # also check submitted $file
my $content = do { # or: my $content = Path::Tiny::path($file)->slurp;
local $/;
open my $fh, '<', $file or die "Can't open $file: $!";
<$fh>;
};
my @f = grep { /\S/ } split /(?<!>)NN+/, $content;
say shift @f;
my $cnt;
for (@f) {
say "\n>contig", (++$cnt), ":\n$_";
}
这会将文件拖入 $content
,因为 NN+
可以跨越多行; Path::Tiny 模块可以使那个更干净。获得的数组的第一个元素不需要>contig
所以它被移走了。
negative lookbehind (?<!...)
使 split
分隔符模式中的正则表达式匹配 NN+
仅当前面没有 >
时,从而保护(不包括) header 行可能以此开头。如果 header 可能包含不在 >
之后的连续 N
,那么您需要对其进行优化。
我有一个包含以下序列的 fasta 文件:
>NZ_OCNF01123018.1
TACAAATACAACAAATACAAGTACACCAAGTACAAATACAAGTATCCCAAGTACAAATACAAGTA
TCCCAAGTACAAATACAAGTATTCCAAGTACAAATACAAAACCTGTTGAGCAACCTAAACCTGTTGAAC
AGCCCAAACCTGTTGAACAGCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAACCTTTATCCGCACTTA
CGAGCAAATACACCAATACCGCTTTATCGGCACAGTCTGCCCAAATTGACGGATGCACCATGTTACCCAACAC
ATCAATCAACGTTTGTGGGATCACCTGAAAAAGGGCGCGGTTTGTGGTTGATG
>NZ_OCNF01123018.2
AATTGTCGTGTAAAGCCACACCAAACCCCATTATAGCCCCAAAAACACCAAAAAGGCTGCCTGAACCACATTTCAGACAG
我想将文件中包含多个 N
的所有序列在它出现的位置拆分,并从中生成两个序列。
预期解决方案:
>NZ_OCNF01123018.1
TACAAATACAACAAATACAAGTACACCAAGTACAAATACAAGTATCCCAAGTACAAATACAAGTA
TCCCAAGTACAAATACAAGTATTCCAAGTACAAATACAAAACCTGTTGAGCAACCTAAACCTGTTGAAC
AGCCCAAACCTGTTGAACAGC
>contig1
AAACCTTTATCCGCACTTA
CGAGCAAATACACCAATACCGCTTTATCGGCACAGTCTGCCCAAATTGACGGATGCACCATGTTACCCAACAC
ATCAATCAACGTTTGTGGGATCACCTGAAAAAGGGCGCGGTTTGTGGTTGATG
>NZ_OCNF01123018.2
AATTGTCGTGTAAAGCCACACCAAACCCCATTATAGCCCCAAAAACACCAAAAAGGCTGCCTGAACCACATTTCAGACAG
我的(不优雅的)方法是这样的:
perl -pe 's/[N]+/\*/g' $file | perl -pe 's/\*/\n>contig1\n/g'
当然这也替换了序列头的 N
并创建没有序列的头。另外,最好将新的 'contigs' 从 1 编号到 x,以防有多个带有 N
的序列。
你有什么建议?
我稍微扩展了你的 perl 一行代码:
cat file.fasta | \
perl -pe 's/\n//g unless /^>/; s/>/\n>/g;' | \
perl -pe 's/N+(?{$n++})/\n>contig${n}\n/g unless /^>/'
第一部分是去掉碱基之间的换行,第二部分是替换连续的'N'。
我建议使用 split
而不是试图让正则表达式 只是 正确,并且在脚本中而不是脆弱和拥挤的 "one"-班轮。
use warnings;
use strict;
use feature 'say';
my $file = shift @ARGV;
die "Usage: [=10=] filename\n" if !$file; # also check submitted $file
my $content = do { # or: my $content = Path::Tiny::path($file)->slurp;
local $/;
open my $fh, '<', $file or die "Can't open $file: $!";
<$fh>;
};
my @f = grep { /\S/ } split /(?<!>)NN+/, $content;
say shift @f;
my $cnt;
for (@f) {
say "\n>contig", (++$cnt), ":\n$_";
}
这会将文件拖入 $content
,因为 NN+
可以跨越多行; Path::Tiny 模块可以使那个更干净。获得的数组的第一个元素不需要>contig
所以它被移走了。
negative lookbehind (?<!...)
使 split
分隔符模式中的正则表达式匹配 NN+
仅当前面没有 >
时,从而保护(不包括) header 行可能以此开头。如果 header 可能包含不在 >
之后的连续 N
,那么您需要对其进行优化。