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

Calculate correct number of characters using Awk ggsub

我正在尝试计算序列(fasta 格式)中特定字符模式的数量。在我的例子中,我想计算上下文“CC”在序列中出现的频率。整个脚本运行良好,但我遇到了一个小问题。

为了计算“CC”上下文,我使用脚本的以下部分:

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

当我有这样的 fasta 序列时,我遇到了问题:

>name_sequence_1
CCCCC 

在这种情况下,CC的编号应该是4(位置1-2、2-3、3-4和4-5),但是gsub给我的编号是2,因为替换完第一个CC之后, 它跳到第 3 个 C 等等。

有什么方法可以使用 gsub 解决这个问题,或者我可以使用其他代码来计算此类上下文吗?

谢谢!

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

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

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

但这里有一个更强大的通用解决方案,即使目标字符串不是 1 个字符的重复,它也能工作and/or它包含正则表达式或反向引用元字符:

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

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