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

标签 linux shell count awk frequency

文件中的大量数据(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/

相关文章:

mysql - mysql中的行到列

Java:计算字符串中序列的频率

linux - 可靠地找到同一台机器上两个时钟之间的偏移量

bash - 有没有办法检查 bash 脚本是否完整?

sql-server - 无条件 Count(*) 与系统表

linux - 从 shell 脚本动态地为调用脚本提供默认输入

linux - 如何从 RabbitMQ 执行本地 bash 脚本?

c - 同步访问共享内存

c++ - 在进入 main() 之前我遇到段错误

java - java中有真正的异步文件访问器吗?