awk结合和平均匹配字段

时间:2015-11-11 21:42:51

标签: awk

我正在尝试使用awk以下列格式输出数据。

`$4` is `last # in `$6` that matches `$4` and maps to `$5` with an average depth of `average of $7` that matches `$4`

输入

chr1    955543  955763  chr1:955543-955763  AGRN-6|gc=75    1   20
chr1    955543  955763  chr1:955543-955763  AGRN-6|gc=75    2   20
chr1    955543  955763  chr1:955543-955763  AGRN-6|gc=75    3   22
chr1    957571  957852  chr1:957571-957852  AGRN-7|gc=61.2  1   201
chr1    957571  957852  chr1:957571-957852  AGRN-7|gc=61.2  2   201
chr1    957571  957852  chr1:957571-957852  AGRN-7|gc=61.2  3   201
chr1    957571  957852  chr1:957571-957852  AGRN-7|gc=61.2  4   202

所需的输出

chr1:955543-955763 is 3 bases and maps to AGRN-6|gc=75 with an average  depth of 20.6
chr1:957571-957852 is 4 bases and maps to AGRN-7|gc=61.2 with an average depth of 201.3

我认为这个awk很接近,希望是一个好的开始。谢谢你:)。

awk '
    {N[$4]++
     T[$4]+=$6
     M[$4]=$7
    }
END     {for (X in N) printf ("%s is %d bases and maps to %s with an average depth"\
                            " of %f reads\n", X, N[X], M[X], T[X]/N[X]);
    }
'  input.txt > output.txt

1 个答案:

答案 0 :(得分:1)

这是一个没有格式化和单词的工作原型

$ awk '{k=$4 FS $5; a[k]+=$7; c[k]++} 
    END{for(k in a) 
          {split(k,ks,FS); 
           print ks[1],c[k],ks[2],a[k]/c[k]}}' file  

chr1:957571-957852 4 AGRN-7|gc=61.2 201.25
chr1:955543-955763 3 AGRN-6|gc=75 20.6667

添加缺少的单词并使用printf进行数字格式化(如果重要)。 awk对数组进行洗牌并丢失订单,但如果您使用gawk

,则会对其进行修复