文件中的大量数据(3 列),例如:
longitude latitude count
20.12 50.45 1
35.78 24.26 1
20.48 50.16 2
... ... ...
map (经纬度)分割很多格子: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]
网格在 map 上按 0.5*0.5 格式化。
例如: 上面的第1条和第3条记录位于网格经度[20.0, 20.5)和纬度[50.0, 50.5),所以counts=1+2=3。
那么,如何使用 awk 或其他脚本编程从数据文件中获取位于每个网格中的计数? 如何绘制结果?
最佳答案
我想这会做你想做的:
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)和纬度/经度范围来计算数组的整数限制。
注意 2:这里显示 awk
中缺少有用的预定义函数,我需要自己定义 floor
,所有的事情。我想知道为什么选择排除大多数 C
数学函数。
注 3:如果不清楚,其输出将是每个单元格的命中计数的大型矩阵,每 0.5 步的纬度为一行,每这样的经度步长为一列。
关于linux - 如何计算位于小网格中的元素的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13220928/