我有一个如下所示的文本文件。第一列是位置,第二列是位置,第三列是值。
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
...
如何获得每个窗口和中位数内的初始位置?
答案 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
如果最后一个窗口不是全尺寸,则不会处理