2015-12-31 75 views
2

我有2列像一個文件:如何計算awk中幾個範圍的行數?

mm6 8 
mm6 1 
mm6 15 
mm6 30 
mm9 2 
mm6 20 
mm6 12 

我試圖讓一個腳本awk來提取多少行有一個範圍內。 現在我有:

awk { if ($2 >= 1 && $2 <= 20) print $1 " " $2} 
輸出

我得到落入該範圍

mm6 8 
mm6 1 
mm6 15 
mm9 2 
mm6 20 
mm6 12 

但現在我試圖讓awk來計算有多少行對每一塊都行10個單位,直到它達到一個確定的值,例如100。

我預期這樣的輸出:

mm6 10 2 
mm6 20 3 
mm9 10 1 

說明:MM6已1-10 2個值之間,MM6具有值三月11日至20日之間,MM9具有1-10

之間1值

我卡住了,有人可以幫忙嗎?

+2

對不起,但這將需要比我可以騰出更長的時間。我看不到一種簡單的方法來推廣處理一組範圍,即10-20,20-30,30-40 ...... 90-100 ......。它在哪裏結束?放下我的答案,因爲它是一個不同的問題。祝你好運。 awk巡邏隊可能會放假,但他們會回來的時候會有一些好點子。祝你好運。 – shellter

+0

加上一個大大改善問題。祝你好運。 – shellter

+0

當我試圖寫smth時,我想在變量中定義腳本的開頭,例如: awk -v range = 10 -v end = 100 -f script.awk文件 –

回答

3

awk來救援!使用

你的第一個輸入

$ awk '{a[$1 FS 10*int(($2-1)/10)+10]++} 
    END{for(k in a) print k,a[k]}' file      

mm6 10 2 
mm6 20 3 
mm6 30 1 
mm9 10 1 

可以前或後添加過濾器。

說明:我們創建了一個密鑰來計數並在最後打印帶有計數的密鑰。關鍵是兩個部分,第一個是標識符,第二個是範圍到分箱的映射。例如,要將0-9映射到0,10-19到1,可以用10除以整數部分。你的範圍從1-10開始減去1,然後除以10;你的箱子是10的倍數,所以乘以10.也使用上限,所以加10。

+0

卡拉克法!驚人!!我永遠不會得到這個權利。所以一個簡單的腳本。我想的太複雜了。感謝您的幫助。我現在需要研究這個以瞭解這項工作。 –

+0

Karakfa,你能向我解釋劇本的每一部分是什麼嗎? –

+1

請參閱更新說明。 – karakfa