Загляните на следующую строку, но не потребляйте ее
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 будет установлена в следующую строку файла и будет пустой в последней строке.