使用Awk ggsub计算正确的字符数



我试图计算序列中特定字符模式的数量(fasta格式)。在我的例子中,我想计算上下文"CC"存在于一个序列中。整个脚本运行良好,但我遇到了一个小问题。

用于计算"CC"我使用脚本的以下部分:

CC=gsub(/CC/,"CC");
print CC

当我有一个像这样的快速序列时,我遇到了一个问题:

>name_sequence_1
CCCCC 

在这种情况下,CC的数量应该是4(位置1-2,2-3,3-4和4-5),但gsub给我的数字是2,因为在替换第一个CC之后,它跳到第三个C,以此类推。

是否有任何方法我可以如何修复使用gsub或有另一个代码我可以用来计算这样的上下文?

谢谢!

假设您声明的预期输出是错误的,这可能是您想要做的:

$ echo 'CCCCC' |
awk '{
str = $0
cnt = 0
while ( sub(/CC/,"C",str) ) {
cnt++
}
print cnt
}'
4

$ echo 'CCCACCCCC' |
awk '{
str = $0
cnt = 0
while ( sub(/CC/,"C",str) ) {
cnt++
}
print cnt
}'
6

,但这里有一个更强大的通用解决方案,即使目标字符串不是1个字符的重复和/或它包含regexp或反向引用元字符:

$ echo 'CCCCC' |
awk '{
cnt = 0
for ( i=1; i<length($0); i++ ) {
cnt += ( substr($0,i,2) == "CC" )
}
print cnt
}'
4

$ echo 'CCCACCCCC' |
awk '{
cnt = 0
for ( i=1; i<length($0); i++ ) {
cnt += ( substr($0,i,2) == "CC" )
}
print cnt
}'
6

相关内容

  • 没有找到相关文章

最新更新