我需要帮助从bash读取行。
我的格式为x,y,z(x,y)。(它是3列的文本文件) 它是约。 1000x1000点大,所以基本上100万列。
我想找到局部最大值,所以我需要检查当前点之前和之后的点999,1000,1001,以及当前行之前和之后的一行。我不想跟踪2k值(或者我应该?)
有什么想法吗?
编辑: 看起来我不清楚。
有3列数字,如下所示:
0,0,0
0,1,0
0,2,0
1,0,0
1,1,1
1,2,0
2,0,0
2,1,0
2,2,0
所以,第三列以某种方式依赖于前两个,我想找到该列的局部最大值,在这种情况下,我希望得到结果
1,1,1
在这里,我只有一点是最大的,但原则上,我正在寻找局部最大值,所以我想要所有这些。
编辑2:
文件中的所有数字都是双精度。
我非常抱歉这个烂摊子,我是这个论坛的新手,我是bash-programming的新手。
答案 0 :(得分:2)
编辑回答
好的,我已经阅读了你的新解释,我仍然不确定我理解你,但我认为你有一个二维数组的值,你正在寻找任何比他们的邻居更大的点。正确的吗?
我会用这样的东西:
awk -F',' 'BEGIN {xmin=ymin=1000;xmax=ymax=-1000}
{x=$1; y=$2
if(x<xmin)xmin=x
if(y<ymin)ymin=y
if(x>xmax)xmax=x
if(y>ymax)ymax=y
grid[$1 SUBSEP $2]=$3
}
END {
for(x=xmin+1;x<=xmax-1;x++){
for(y=ymin+1;y<=ymax-1;y++){
this=grid[x SUBSEP y];
if((this>grid[x-1 SUBSEP y-1]) &&
(this>grid[x-1 SUBSEP y ]) &&
(this>grid[x-1 SUBSEP y+1]) &&
(this>grid[x-1 SUBSEP y ]) &&
(this>grid[x+1 SUBSEP y ]) &&
(this>grid[x+1 SUBSEP y-1]) &&
(this>grid[x+1 SUBSEP y ]) &&
(this>grid[x+1 SUBSEP y+1]))
print x,y,this;
}
}
}' file
-F
表示您的字段以逗号分隔。在开始时(在BEGIN{}
块中),我将x
和y
的最小值和最大值初始化为一些不太可能的大/小值,这些值在我读取时会被覆盖数据将在下一步中使用。
然后,当我读取每一行时,我会提取x
和y
值并检查它们是否大于或小于我所拥有的最大x
和y
到目前为止看到了这样我就会知道你网格的极限 - 即最小x值,最大x值,最小y值和最大y值。我还保存了我在grid[]
和x
值索引的数组y
中看到的每个值。
最后,在读完整个文件之后(在END{}
块中),我遍历了我看到的所有x
和所有y
值。对于每个x
和y
,我从z
数组中获取grid[]
值。然后我检查这个值是否大于它的所有8个邻居,如果是,我打印出来。
请注意,这不会处理网格边缘的最大值 - 您必须将for
循环更改为for(x=xmin;x<=xmax...
- 以及y
循环。
原始回答
我不确定我是否完全理解你的问题,所以请解释(而不是downvote)我误解的错误,我会纠正我的答案。
我想你想要这样的东西:
awk -v r=11000 'BEGIN{
w[r-1]++; w[r]++; w[r+1]++;
w[r-1001]++;w[r-1000]++;w[r-999]++;
w[r+999]++;w[r+1000]++;w[r+1001]++
}
NR in w{print $0}' file
基本上,您传入您感兴趣的行号,在此示例中记录11000。然后,在开始时,awk
会计算您想要查看的所有行号,并将它们存储在数组w[]
中 - 将其视为wanted
行。然后,在读取每条记录时,它会检查该记录是否是您想要的记录,如果是,则打印出来。
输出是这样的:
10,999,7
10,1000,7
11,1,7
11,999,7
11,1000,7
12,1,7
12,999,7
12,1000,7
13,1,7
如果您愿意,可以将它设为像这样的单行:
awk -v r=11000 'BEGIN{w[r-1]++;w[r]++;w[r+1]++;w[r-1001]++;w[r-1000]++;w[r-999]++;w[r+999]++;w[r+1000]++;w[r+1001]++} NR in w{print $0}' file
请注意,awk
行号始于1
,因此您可能需要相应地调整r
的值,以获得您实际意思的确切行。
答案 1 :(得分:1)
我们来看看这个文件:
0,0,0
0,1,0
0,2,0
1,0,0
1,1,1
1,2,0
2,0,0
2,1,0
2,2,0
如果你想得到你的比赛(1,1,1)附近的2分,你可以写下:
$ cat mydata | grep -C2 -e '1,1,1'
0,2,0
1,0,0
1,1,1
1,2,0
2,0,0
当然,您可以更改匹配点之前/之后要获得的行数:
-C<lines> # Above and After
-B<lines> # Before
-A<lines> # After
您还可以尝试为任何x:
匹配y和z的特定值cat t | grep -C2 -e '^[0-9]\+,\s*1,\s*3'