awk在位置和平均值之间的字段中包含名称

时间:2015-10-02 21:04:00

标签: awk

在位置awk下面的$1下,打印出计算出的平均值$4。我似乎无法正确地将语法包含在$1$4之间的输出中。谢谢你:)。

awk '{
  if(len==0){
     last=$1;total=$4;len=1;getline
  }
  if($1!=last){
      printf("%s\t%f\n", last, total/len);
      last=$1;total=$4;len=1
  }
  else{
       total+=$4;len+=1
  }
}
END{
  printf("%s\t%f\n", last, total/len)
}' Input.bed > output.txt

Input.bed

chr1:955542-955763  AGRN:exon.1 1   0
chr1:955542-955763  AGRN:exon.1 2   0
chr1:955542-955763  AGRN:exon.2 3   0
chr1:955542-955763  AGRN:exon.2 4   1

当前output.txt

chr1:955542-955763  21.289593
chr1:957570-957852  304.861702

所需的output.txt

chr1:955542-955763 AGRN:exon.1  21.289593
chr1:957570-957852 AGRN:exon.2  304.861702

也许

awk '{if(len==0){last=$1;**name=$2**,total=$4;len=1;getline}if($1!=last){printf("%s\t%f\n", last, ,**name**, total/len);last=$1;name=$2;total=$4;len=1}else{total+=$4;len+=1}}END{printf("%s\t%f\n", last,**name**, total/len)}' Input.bed > output.txt

发布的输入和输出不是真实的,所以#的含义并不多:)

修改

awk '{for (i=1; i<=NF; i++) print i, $i}' IonXpress_008_150902_4column.bed | head -4
1 chr1:955542-955763
2 AGRN:exon.1
3 1
4 0

1 个答案:

答案 0 :(得分:4)

我认为你的密钥应该是前两个字段的组合。对于您提供的样本输入

$ awk '{k=$1 OFS $2; s[k]+=$4; c[k]++} END{for(i in s) print i, s[i]/c[i]}' file

会产生这个

chr1:955542-955763 AGRN:exon.1 0
chr1:955542-955763 AGRN:exon.2 0.5

如果字段2不是键的一部分,并且您希望从每个字段的最后一行获得值1

$ awk '{k=$1; s[k]+=$4; f2[k]=$2; c[k]++} END{for(i in s) print i, f2[i], s[i]/c[i]}' file

将产生

chr1:955542-955763 AGRN:exon.2 0.25