awk,在完整性检查时跳过当前规则

awk, skip current rule upon sanity check

如何在完整性检查失败时跳过当前 awk 规则?

{
  if (not_applicable) skip;
  if (not_sanity_check2) skip;
  if (not_sanity_check3) skip;
  # the rest of the actions
}

恕我直言,这样写代码比

更简洁
{
  if (!not_applicable) {
    if (!not_sanity_check2) {
      if (!not_sanity_check3) {
      # the rest of the actions
      }
    }
  }
}

1;

我需要跳过当前规则,因为最后有一个捕获所有规则。

更新,我正在尝试解决的案例。

文件中有多个匹配点,我想匹配和更改,但是,没有其他明显的标志可以匹配我想要的。 嗯...,让我以这种方式简化它,我想匹配并更改第一个匹配项并跳过其余匹配项并按原样打印它们。

据我了解您的要求,您在这里寻找 ifelse if。您也可以使用更新版本的 gawk 软件包中可用的 switch 案例。

让我们以Input_file为例:

cat Input_file
9
29

以下是此处的 awk 代码:

awk -v var="10" '{if([=17=]<var){print "Line " FNR " is less than var"} else if([=17=]>var){print "Line " FNR " is greater than var"}}' Input_file

这将打印如下:

Line 1 is less than var
Line 2 isgreater than var

因此,如果您仔细查看代码,它会检查:

  • 第一个条件如果当前行小于 var 那么它将在 if 块中执行。
  • else if 块中的第二个条件,如果当前行大于 var 则在那里打印它。

我真的不确定你想做什么,但如果我只关注你问题 I want to match & alter the first match and skip the rest of the matches and print them as-is. 中的最后一句话……这是你想做的吗?

{ s=1 }
s && /abc/ { [=10=]="uvw"; s=0 }
s && /def/ { [=10=]="xyz"; s=0 }
{ print }

例如借 :

$ cat Input_file
9
29

$ awk -v var='10' '
    { s=1 }
    s && ([=12=]<var) { [=12=]="Line " FNR " is less than var";    s=0 }
    s && ([=12=]>var) { [=12=]="Line " FNR " is greater than var"; s=0 }
    { print }
' Input_file
Line 1 is less than var
Line 2 is greater than var

我为 sane 使用了布尔标志变量名称 s 因为你在问题中也提到了一些关于测试条件的完整性检查所以每个条件都可以读作 is the input sane so far and this next condition is true? .