Awk 在顶层处理而不读取下一行

Awk 在顶层处理而不读取下一行,awk,Awk,是否有办法重新开始顶层处理?接下来执行此操作,但它也从输入中读取一行。我想不读另一行就做这件事 我的用例是,当我看到行匹配模式1时,我希望停止处理,直到我看到行匹配模式2。如果有一根未系上的绳子,我会做的 /pattern1/ { getline; while (! /pattern2/ ) { getline; } ungetline; } 我可能会陷入程序性方法中为了解决您描述的案例,我会使用福林方法: BEGIN { skip = 0 } /pattern1/ { s

是否有办法重新开始顶层处理?接下来执行此操作,但它也从输入中读取一行。我想不读另一行就做这件事

我的用例是,当我看到行匹配模式1时,我希望停止处理,直到我看到行匹配模式2。如果有一根未系上的绳子,我会做的

/pattern1/ {
   getline;
   while (! /pattern2/ ) { getline; }
   ungetline; }

我可能会陷入程序性方法中

为了解决您描述的案例,我会使用福林方法:

BEGIN { skip = 0 }

/pattern1/ { skip = 1 ; next }

skip && /pattern2/ { skip = 0 }

!skip && /text/ {
  print "Found text which is not between pattern1 and pattern2"
  next
}

!skip {
  print $0
}
这个!skip仅在skipis为0时启用最后两个规则

但这也应该起作用:

BEGIN { skip = 0 }

/pattern1/ { skip = 1 ; next }

skip && /pattern2/ { skip = 0 }

skip { next }

/text/ {
  print "Found text which is not between pattern1 and pattern2"
  next
}

{ # else...
  print $0
}
注:

在上述示例中处理了模式2。如果不需要,则将下一步放入其操作中

实际上,BEGIN规则不是必需的,但它很好地记录了skip变量的特殊含义


awk中没有倒带功能。所以你需要重新思考你的方法。请看,向我们展示一个实际的文件和一个准确的预期输出是很好的,这样我们就可以看到是否可以用其他方式来完成您的问题,包括简洁、可测试的样本输入和预期输出,否则您可能会得到一个与实际问题不同的解决方案。如前所述,您已经声明了一个,并且您实际上想要做的事情非常模糊,您显然要求在不读取输入文件中的行的情况下识别pattern2-想想看!。你可以将整个文件读入NR索引数组,然后自己在上面构建控件。我想这是因为你这么说了:不读下一行…直到我看到一行匹配的模式2。wrt我无法描述最初的问题,我会拒绝给出一个虚构的例子——不要拒绝,如果你想鼓励人们阅读并回答你的问题,就这么做吧。为什么您认为到目前为止只有1个暂定答案?是因为我们不知道如何使用awk,还是因为我们不了解您的需求?看见到目前为止,你发布的是一个经典。谢谢Scheff,我正在做一些类似的事情,但我正在寻找一个更短的方法来完成它,或者是一个惯用的awkway@MiserableVariable我不确定,但我相信这是awk的方式:在模式匹配中引入状态。除了存在显式状态外,在lex/flex中也可以这样做。使用一个awk脚本将输入拆分为多个输出通道/文件,并将其他awk脚本应用于这些通道/文件,然后使用bash脚本将它们缝合在一起,可以实现更复杂的解决方案。我更喜欢所有内容都在一个脚本中的解决方案,即使在这种情况下有点复杂。