使用awk获取文本文件中的统计信息

时间:2018-04-09 08:01:33

标签: awk

我有一个像这个小例子的文本文件:

>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

但它没有返回我想要的东西。你知道怎么解决吗?

3 个答案:

答案 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代码的第一部分