如何计算位于小网格中的元素的频率?

时间:2012-11-04 17:18:58

标签: linux shell count awk frequency

文件中的大量数据(3列),例如:

longitude  latitude   count
20.12      50.45       1
35.78      24.26       1
20.48      50.16       2
...         ...       ...

地图(经度和纬度)拆分多个网格:0.5 * 0.5(大小),例如:

longitude: [0, 0.5), [0.5, 1.0), ... , [179.5, 180.0)
latitude : [-90, -89.5), [-89.5, -89.0), ... , [89.5, 90.0]

格子在地图上的格式为0.5 * 0.5。

例如: 上面的第1和第3条记录位于网格经度[20.0,20.5]和纬度[50.0,50.5],因此计数= 1 + 2 = 3.

那么,如何使用awk或其他脚本从数据文件中获取位于每个网格中的计数? 如何绘制结果?

1 个答案:

答案 0 :(得分:1)

我认为这会做你想做的事情:

awk 'function floor(x){
    y=int(x); return y>x?y-1:y
}{
    ilon=floor($1/0.5)
    ilat=floor($2/0.5)
    hist[ilat,ilon]+=$3
}END{
    for(ilat=-180;ilat<=180;ilat++)
        for(ilon=-360;ilon<=360;ilon++){
            printf(" %4d", hist[ilat,ilon])
        printf("\n")
    }
}'

注意:我硬编码lon [-180:180]和lat [-90:90](包括步长)的限制。更一般地说,你可以根据你当前的步长来计算数组的整数限制(我想你可能想要使用不同的步骤,而不是只使用0.5)和lat / lon-range。

注意2:awk中缺少有用的预定义函数,这里显示我需要自己定义floor。我想知道为什么选择排除大多数C数学函数。

注3:如果不清楚,则输出为每个单元格的大量命中计数,纬度每0.5步一行,经度中每个步骤一列。