2016-06-08 38 views
0

我有一个如下所示的文本文件。第一列是位置,第二列是位置,第三列是值。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 
... 

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

回答

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 

没有按处理如果最后一个窗口不是全尺寸

+0

多数民众赞成酷!正是我所期待的。可以通过检查忽略/跳过小于窗口大小的窗口吗? – rmf

+1

这会忽略最后一个部分块,因为一些额外的逻辑创建一个'END'块并检查r是否小于(w-1),这将意味着最后一个块的部分并相应报告。 – karakfa