На это отвечает комментарий @ 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.