Bash Awk:具有开始和停止位置的窗口中位数

时间:2016-06-08 13:46:05

标签: bash awk

我有一个如下所示的文本文件。第一列是位置,第二列是位置,第三列是值。

1 10 200
1 11 150
1 12 300
2 13 400
2 14 100
2 15 250
3 16 200
3 17 200
3 18 350
3 19 150
...

我想计算某个窗口上值字段的中位数。例如,假设窗口大小为4行。以下是上述样本数据的预期结果:

1 2 10 13 250
2 3 14 17 200
... 

对于每个窗口(4行),第一列的第一个值(在窗口内),第一列的最后一个值(在窗口内),第二列的第一个值,第二列的最后一个值和中值第三栏报道。

我已经部分工作了。下面的脚本打印第1列的最后位置,第2列的最后位置和平均值。

win=4
cat file.txt | awk -v win="$win" '{sum+=$3} (NR%win)==0 {print $1,$2,sum/win;sum=0}'

2 13 262.5
3 17 187.5
...

如何获得每个窗口和中位数内的初始位置?

1 个答案:

答案 0 :(得分:2)

$ awk '{r=(NR-1)%4; a[r]=$3} 
   r==0{f1=$1; s1=$2} 
   r==3{asort(a); print f1,$1,s1,$2,(a[2]+a[3])/2; delete a}' file

1 2 10 13 250
2 3 14 17 200

请注意,删除不是必需的,因为在每个窗口计算时都会覆盖值...

你可以参数化窗口大小,需要处理奇数/偶数

$ awk -v w=5 '{r=(NR-1)%w; a[r]=$3} 
          r==0{f1=$1; s1=$2} 
      r==(w-1){asort(a); 
               print f1,$1,s1,$2,(w%2?a[int(w/2)+1]:(a[w/2]+a[w/2+1])/2); 
               delete a}' file

1 2 10 14 200
2 3 15 19 200
如果最后一个窗口不是全尺寸

,则

不会处理