gawk:为什么 "next;" 不抑制与模式匹配的行?

gawk: why doesn't "next;" suppress lines matching a pattern?

我有以下 awk 程序:

/.*needle.*/
{
    if ([=11=] != "hay needle hay")
    {
        print "yay: ", ;
        next;
    }

    print "ya2";
    next;
}

{
    print "no";
    next;
}

我 运行 它作为 gawk -f test.awk < some.log > out.logGNU Awk 4.2.1, API: 2.0.

some.log:

hay hay hay
hay needle hay
needle
hay hay
hay
hay

out.log:

yay:  hay         
hay needle hay    
ya2               
needle            
yay:  needle      
yay:  hay         
yay:  hay         
yay:  hay         

我希望它只打印 "ya2-new line-yay: needle"。

这引发了问题:

您似乎是 Allman indentation style 的粉丝。我假设 if ([=13=] != ... 块只应该 运行 在记录匹配 needle 的地方——你需要将左大括号放在与模式相同的行上。

/.*needle.*/ {
    if ([=10=] != "hay needle hay")
    {
        print "yay: ", ;
        next;
    }

    print "ya2";
    next;
}

输出:

no
ya2
yay:  needle
no
no
no

在 awk 中,换行符是一个终止符,就像分号一样。

你现在拥有的是:

# if the line matches "needle", print it verbatim
/.*needle.*/     

# And **also**, for every line, do this:
{
    if ([=12=] != "hay needle hay")
    {
        print "yay: ", ;
        next;
    }

    print "ya2";
    next;
}