Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在特定行中搜索范围内的值。Unix bash脚本_Bash_Unix_Awk - Fatal编程技术网

在特定行中搜索范围内的值。Unix bash脚本

在特定行中搜索范围内的值。Unix bash脚本,bash,unix,awk,Bash,Unix,Awk,我想跳到文件中的一行,第33866行。如果这一行中的第三个数字在-10和+10范围内,那么我想将下一行33867打印到一个文件并停止 如果不是,则应查看第67893行(差值+34027),现在如果在范围内,则打印下一行并停止 这应该继续,接下来查看第101920行(差值+34027),依此类推,直到找到该范围内的值或到达文件末尾 现在,不管是否打印了任何内容,我需要它来重复这个过程,但是在一个新的起始行,这次新的起始行是33869(区别3),将33870行打印到同一个文件中。 理想情况下,它将重

我想跳到文件中的一行,第33866行。如果这一行中的第三个数字在-10和+10范围内,那么我想将下一行33867打印到一个文件并停止

如果不是,则应查看第67893行(差值+34027),现在如果在范围内,则打印下一行并停止

这应该继续,接下来查看第101920行(差值+34027),依此类推,直到找到该范围内的值或到达文件末尾

现在,不管是否打印了任何内容,我需要它来重复这个过程,但是在一个新的起始行,这次新的起始行是33869(区别3),将33870行打印到同一个文件中。 理想情况下,它将重复n次,n是运行脚本时用户输入的读取值

如果这要求太多,请马上阻止我,我会继续用头撞墙,在网上搜索如何让这项工作靠我自己完成。另外,如果我试图跳转到一条特定的线路,并且应该通过其他方式搜索该线路,请让我知道我是否以错误的方式进行操作。 非常感谢您的任何意见

编辑: 下面是正在处理的两行的示例:

    17.33051021          18.02125499          30.40520932
    1.776579372         -23.74037576          12.48448432

第一个数字从第6列开始,第二个数字从第26列开始,第三个数字从第46列开始。(如果忽略负号,我认为这无关紧要)

由于我们没有任何输入可供测试,我将在不测试的情况下给您一个答案

tl=$(wc -l input)
awk '{
   for (i=33866; i<tl; i+=34027) {
      if (NR==i && $3 >= -10 && $3 <= 10) {
         getline;
         print;
         exit;
      }
   }
}' input
tl=$(wc-l输入)
awk'{

对于(i=33866;i=-10&&$3阅读您的问题,我猜您的文件可能相当大。此外,我假设“第三个数字”是第三个字段。因此我提出了以下一行:

awk -v l=33866 -v d=34027 'NR==l&&$3>=-10&&$3<=10{p=1;next}p{print;exit}{l+=d}' file

awk-vl=33866-vd=34027'NR==l&&$3>=-10&&$3找到匹配项,然后打印下一行:)@肯特:很好,让我来修复。OP想从特定的一行检查文件,而不是从第一行检查。这很容易修复。如果我正确理解了你的代码,你就要对输入文件中的每一行执行
for循环
?@Kent你有没有机会再快速查看一下我上面的编辑?这不是让我ping你在你的回答中,这是对这一个的评论。我认为这会起作用,所以到目前为止,谢谢。当测试代码挂起一段时间时,处理大文件。是否可以在前面添加一个循环,以便在完成后查找下一个循环,即更改l+3(不需要手动执行此操作)?@sparxwil如果您的要求是,您有不同的
l-d
对要检查,但您只想通过处理文件一次来进行检查。这取决于您的文件大小。如果您可以将所有行放入内存(在数组中),您可以实现您的目标。否则,在一次运行后,您必须从一开始就为新给定的
l
d
处理文件。另一个想法是,您处理文件一次,并为每行选择第三列,作为“索引文件”(某种类型)处理到新文件。您只需检查此文件,并确定要打印的行号。我希望您能理解我的意思。@sparxwil同样对于
l
d
,它也可能是shell变量。您可以使用shell脚本设置这些值。好的,所以我只添加了一点for循环,对于1.6GB的文件,该过程仍然非常快,大约30秒:
对于第338行{66,69,72,75,78,81,84,87,90,93,96,99};do(awk-vl=“$f”-vd=34027'NR==l&&3>=-25&&$3@sparxwil我认为您的
for
语句可能有问题。什么是
338{66,…}
?请阅读以下内容,看看是否有帮助: