我有一个像这个小例子的文本文件:
>chr10:101370300-101370301
A
>chr10:101370288-101370289
A
>chr10:101370289-101370290
G
>chr10:101471626-101471627
g
>chr10:101471865-101471866
g
>chr10:101471605-101471606
a
>chr10:101471606-101471607
g
>chr10:101471681-101471682
如下所示,以">"
开头的每一行都有一封信。这些字母是A, G, T or C
。在我的结果中,我想得到它们的频率百分比。这是预期输出的一个小例子。
A = 28.57
G = 14.29
g = 42.85
a = 14.29
我正试图在awk
中使用:
awk 'if $1 == "G", num=+1 { a[$1]+=num/"G" }
if $1 == "G", num=+1 { a[$1]+=num/"C" }
if $1 == "G", num=+1 { a[$1]+=num/"T" }
if $1 == "G", num=+1 { a[$1]+=num/"A" }
' infile.txt > outfile.txt
但它没有返回我想要的东西。你知道怎么解决吗?
答案 0 :(得分:2)
527755e
解决方案:
Awk
awk '/^[a-zA-Z]/{ a[$1]++; cnt++ }
END{ for (i in a) printf "%s = %.2f\n", i, a[i]*100/cnt }' file.txt
- 遇到只以字母/^[a-zA-Z]/
开头的记录:
[a-zA-Z]
- 累计每个项目(字母)a[$1]++
- 计算项目总数(字母)输出:
cnt++
答案 1 :(得分:0)
关注awk
可能对您有帮助。
awk '!/^>/{a[$0]++;sum++} END{for(i in a){print i"="(a[i]*100)/sum}}' Input_file
解决方案第二: 如果您希望输出的输出顺序与它们在Input_file中的顺序相同,那么下面的操作就可以完成。
awk '!/^>/{a[$0]++;sum++} !/^>/ && !b[$0]++{array[++j]=$0} END{for(i=1;i<=j;i++){print array[i]"="(a[array[i]]*100)/sum}}' Input_file
答案 2 :(得分:0)
您的示例与您的评论相矛盾(以&gt;开头的每一行都没有显示我的字母,所以我认为它是一个复制/粘贴翻译错误)
awk '{C[$NF]++;S+=0.01} END{ for( c in C ) printf( "%s = %2.2f\n", c, C[c]/S)}' infile.txt > outfile.txt
如果线条与样本相同,则添加&n; NF == 1&#39;作为awk代码的第一部分