计数 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
(我假设 ============
行实际上不是您数据的一部分。)
我试图找到一种方法来计算 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
(我假设 ============
行实际上不是您数据的一部分。)