Загляните на следующую строку, но не потребляйте ее

getline читается в следующей строке и увеличивает счетчик NR на 1. После использования getline, awk возобновляет работу со следующей строкой. В большинстве случаев это желаемое поведение.

В моей особой ситуации мне нужно только заглянуть в следующую строку и в зависимости от ее содержимого я прочитал следующую строку или мне нужно отменить одну строку.

Как я могу отменить одну строку в awk? Я попытался настроить счетчик NR вручную на NR=NR-1, но это не сработает. Или есть метод, который смотрит только на следующую строку без изменения NR?

Мне нужен взгляд одной строки. Простое сохранение строки в переменной и, ссылаясь на нее позже, не работает в этом случае. Я пытаюсь реализовать грамотный инструмент программирования в awk, где главный файл может содержать много подфайлов. Такой подфайл начинается с строки типа "% file:file1". Достигнут конец такого файла, если достигнута линия с нижним отступом или другой линией с линией, подобной "% file:file2".

Набор правил для всех строк, соответствующих /% file:/, не используется, когда я уже прочитал эту строку с getline. Вот почему я хотел бы reset NR в предыдущей строке, затем awk снова прочитал строку, соответствующую /% file:/, и соответствующее правило будет выполнено.

Ответ 1

Это может приблизиться к тому, что вы ищете, и не должно быть так дорого, как решение sed, поскольку AWK поддерживает указатель на файл, который открывается getline.

awk 'FNR == 1 {
         getline nextline < FILENAME
     }
     {
         getline nextline < FILENAME;
         print "currentline is:", $0;
         print "nextline is:   ", nextline
     }' input file

Первый блок считывает первую строку и удаляет ее.

В этой форме getline не задает никаких переменных, таких как NR, FNR, NF или $0. Он устанавливает только переменную, которую вы поставляете (nextline в этом случае).

Для получения дополнительной информации см. .

Ответ 2

Это немного взломанный и довольно дорогостоящий, но для небольших файлов это дает вам представление:

cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline

Это займет текущее значение NR и использует sed для извлечения строки NR + 1 из входного файла. Это дорого, потому что sed будет читать весь файл каждый раз, когда вы делаете просмотр (вы можете немного облегчить это, добавив команду "q" в sed). Переменная nextline будет установлена ​​в следующую строку файла и будет пустой в последней строке.