gawk: почему не «следующий»; подавить линии, соответствующие шаблону? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующая программа на awk:

/.*needle.*/
{
    if ($0 != "hay needle hay")
    {
        print "yay: ", $1;
        next;
    }

    print "ya2";
    next;
}

{
    print "no";
    next;
}

Я запускаю его как gawk -f test.awk < some.log > out.log в GNU 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".

Это вызывает вопросы:

1 Ответ

0 голосов
/ 15 мая 2018

Вы, кажется, поклонник стиля отступа Allman .Я предполагаю, что блок if ($0 != ... должен выполняться только там, где запись соответствует needle - вам нужно поместить открывающую скобку в ту же строку, что и шаблон.

/.*needle.*/ {
    if ($0 != "hay needle hay")
    {
        print "yay: ", $1;
        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 ($0 != "hay needle hay")
    {
        print "yay: ", $1;
        next;
    }

    print "ya2";
    next;
}
...