计数 fasta(对齐)文件中的字符

Count char in fasta (alignment) file

我试图找到一种方法来计算 fasta(比对)文件中的 char(n) 重复次数,因为它位于序列的开头或结尾。忽略序列中的字符。

示例:

输入:

>chromosome1
============
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
TGTGAAGATGCTGGAGGAAACAGGTAnnCAAAAGTATCTATATCCACAGTAAAACAAGTCCTATATTGACAT
CCTGAAAGGCCTCTCAGCAAGGAAGAAGCCACTGCTCCAAAACCGCCAnnnTAAAAAAGCCAGACTACGGTT
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn.

输出

71
74

现在我可以用

计算整个序列中有多少个字符(n)
awk '{print gsub (srch,srch)}' srch="n"

但是我需要一个思路(代码)来区分大块前后的两组。

只需使用 awk,您就可以使用以下脚本。它计算 srch 的所有序列的长度,并在末尾打印找到的第一个和最后一个序列的长度:

# count.awk
BEGIN {
    FS=""
    n=0 
}

NR > 2 { 
    for(i=1; i<=NF; i++) {
        # Increment current group if current character equals srch
        if($i == srch) {
            grp[n]++
        } else {
            # Next group
            n++
            # Next character
            i++
            # Iterate trough line until next sequence of srch
            while($i != srch && i <= NF) {
                i++
                # The next sequence starts
                if ($i == srch) {
                    grp[n]++
                    break
                }
            }
        }
    }   
}
END {
    print "Begin: ", grp[0]
    print "End: ", grp[n-1]
}

这样称呼它:

awk -v srch=n -f count.awk input.fasta

我觉得这个问题相当模糊,但是这个 awk 脚本可能会有所帮助:

/^n+\.$/ { print "after: " length([=10=]) - 1; next; }
/^n+$/   { print "before: " length([=10=]) }

如果您想要 >header 之后的第一行和下一个 >header 之前的最后一行或文件末尾,请尝试类似

awk '/^>/ { if (FNR>1) print n; n=0; p=1; next }
{ n=gsub("n", "n") }
p { print n; p=0 }
END { print n }' file.fasta

(我假设 ============ 行实际上不是您数据的一部分。)