我有一个包含两列的文件,X和Y为正数,非网格数据点(> 10 ^ 5点)。
1 0.9
0.9 1.1
0.5 1.25
2.6 0.9
3.1 2.6
2.9 2.55
4.1 0.9
1.2 6
5.5 2.5
6 4
4 7.2
. .
. .
我想在这些点的选定范围内生成X-Y网格(大小为binsize
)。此外,我想添加第三列,指示网格中每个顶点的正方形区域(binsize
x binsize
)中包含的原始数据点的计数。
如果binsize=5
2.5 2.5 7
2.5 7.5 2
7.5 2.5 2
. . .
. . .
我想向AWK程序传递数据范围和binsize
。
非常感谢你的帮助。
修改:
binsize用于确定我必须计算XY数据点的值的范围。范围输入是选择要计数的x和y值,例如,如果我在[0,5]
中选择x而在[0,5]
中选择y,那么我将仅考虑前八个xy点的分箱。我的真实数据集很大
答案 0 :(得分:2)
我认为解决方案看起来像这样:
awk -v binsize=0.5 -v xmin=0 -v xmax=3 -v ymin=2 -v ymax=4 '
BEGIN {
# Calculate number of x-bins and number of y-bins
nx=int((xmax-xmin)/binsize)
ny=int((ymax-ymin)/binsize)
# Pre-zero all bins else empty entries will not show up in output
for(x=0;x<nx;x++){
for(y=0;y<ny;y++){
output[x,y]=0
}
}
}
{
# pick up x and y
x=$1; y=$2
# if this sample within x-range and y-range
if(x>=xmin && x<=xmax && y>=ymin && y<=ymax){
xindex=int((x-xmin)/binsize)
yindex=int((y-ymin)/binsize)
output[xindex,yindex]++;
printf("DEBUG: x=%f, y=%f (line %d)\n",x,y,NR);
printf("DEBUG: Incrementing bin [%d][%d]\n",xindex,yindex);
}
}
END{
# Print results
for(x=0;x<nx;x++){
for(y=0;y<ny;y++){
printf("%d\t",output[x,y]);
}
printf("\n");
}
} ' points.txt
并将此作为输入:
0.4 2.1
0.39 2.02
0.1 2.4
1 0.9
0.9 1.1
0.5 1.25
2.6 0.9
3.1 2.6
2.9 2.55
你得到这个作为输出:
DEBUG: x=0.400000, y=2.100000 (line 1)
DEBUG: Incrementing bin [0][0]
DEBUG: x=0.390000, y=2.020000 (line 2)
DEBUG: Incrementing bin [0][0]
DEBUG: x=0.100000, y=2.400000 (line 3)
DEBUG: Incrementing bin [0][0]
DEBUG: x=2.900000, y=2.550000 (line 9)
DEBUG: Incrementing bin [5][1]
3 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 1 0 0