Вопрос о распознавании нескольких строк AWK - PullRequest
0 голосов

Я только что прочитал Могут ли шаблоны awk соответствовать нескольким строкам? , чьим приемлемым решением является скрипт, который печатает строку после first half.

how
second half #1
now
first half
second half #2
brown
second half #3
cow
/second half/ {
  if(lastLine == "first half") {
    print
  }
}

{ lastLine = $0 }

Thisдает second half #2.

Я не могу понять, почему { lastLine = $0 } должен идти после /second half/ {...}/.Я попытался поменять их местами, и у меня ничего .

{ lastLine = $0 }

/second half/ {
  if(lastLine == "first half") {
    print
  }
}

Я попытался прочитать man awk, но он не охватывает конечные автоматы.Поиск "конечный автомат awk" дает только связанный вопрос SO.

1 Ответ

0 голосов

На это отвечает комментарий @ oguzismail. Чтобы убрать этот вопрос из очереди без ответа, я собираюсь развернуть его в ответ.

AWK обрабатывает текст для записи . По умолчанию разделитель записей (RS) - это символ новой строки \n, поэтому AWK рассматривает каждую строку как запись.

В первом (правильном) скрипте AWK при обработке первой записи how совпадение /second half/ в

/second half/ {
  if(lastLine == "first half") {
    print
  }
}

оценивается как false , а { lastLine = $0 } сохраняет текущую запись $0 (т.е. how) в переменную lastLine.

Затем приходит вторая запись second half #1, и она соответствует /second half/, поэтому блок {if (lastLine == "first half"){...}} выполняется с lastLine в качестве предыдущей записи (how), даже если $0 равно second half #1 .

Когда процесс продолжается, запись second half #2 в конечном итоге пройдет через вложенный блок {}, так что она будет напечатана.

Если я инвертирую два действия в скрипте AWK, lastLine всегда будет сохранять текущую запись $0, тогда как /second half/ будет сопоставляться тогда и только тогда, когда $0 содержит second half, что не 't равно first half. Следовательно, невозможно , что $0 получает print, редактируемый сценарием 2 nd AWK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...