在fasta(对齐)文件中计算char

时间:2016-06-19 22:24:34

标签: awk count char fasta

我试图找到一种计算fasta(对齐)文件中char(n)重现的方法,考虑到它位于序列的开头或结尾。忽略序列中的字符。

示例:

输入:

2016-06-18 13:54:00 GMT+1

输出

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

此时我可以用

计算整个序列中有多少个字符(n)
71
74

但是我需要一个想法(代码)来区分大块之前和之后的两个组。

3 个答案:

答案 0 :(得分:0)

只需使用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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果你想要>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

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