2016-06-08 25 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