如何读取当前行上方/下方1000行以上的行?

时间:2014-08-27 10:56:14

标签: bash max local

我需要帮助从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的新手。

2 个答案:

答案 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{}块中),我将xy的最小值和最大值初始化为一些不太可能的大/小值,这些值在我读取时会被覆盖数据将在下一步中使用。

然后,当我读取每一行时,我会提取xy值并检查它们是否大于或小于我所拥有的最大xy到目前为止看到了这样我就会知道你网格的极限 - 即最小x值,最大x值,最小y值和最大y值。我还保存了我在grid[]x值索引的数组y中看到的每个值。

最后,在读完整个文件之后(在END{}块中),我遍历了我看到的所有x和所有y值。对于每个xy,我从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'