我试图找到一种计算fasta(对齐)文件中char(n)重现的方法,考虑到它位于序列的开头或结尾。忽略序列中的字符。
示例:
输入:
2016-06-18 13:54:00 GMT+1
输出
>chromosome1
============
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
TGTGAAGATGCTGGAGGAAACAGGTAnnCAAAAGTATCTATATCCACAGTAAAACAAGTCCTATATTGACAT
CCTGAAAGGCCTCTCAGCAAGGAAGAAGCCACTGCTCCAAAACCGCCAnnnTAAAAAAGCCAGACTACGGTT
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn.
此时我可以用
计算整个序列中有多少个字符(n)71
74
但是我需要一个想法(代码)来区分大块之前和之后的两个组。
答案 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
(我假设============
行实际上并不是您数据的一部分。)