Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Peek at next line, but don't consume it

Tags:

awk

gawk

getline reads in the next line and increments the NR counter by 1. After using getline, awk resumes work with the next line. This is the desired behavior in most cases.

In my special situation I need only to peek the next line and depending on its content I read the next line or I need to backtrack one line.

How can I backtrack one line in awk? I tried setting the NR counter manually to NR=NR-1 but this doesn't work. Or is there a method that only looks at the next line without changing NR?

I need a lookahead of one line. Simply saving the line in a variable and referring to it later does not work in this case. I am trying to implement a literate programming tool in awk, where a master file might contain many subfiles. Such a subfile begins with a line like "% file:file1". The end of such a file is reached, if a line with a lower indentation or another line with a line like "% file:file2" is reached.

The rule set for all lines matching /% file:/ is not used, when I have already read this line with getline. That's why I would like to reset NR to the previous line, then awk would read the line matching /% file:/ again and the appropriate rule would be executed.

like image 587
Chris Avatar asked Apr 19 '12 16:04

Chris


People also ask

Which method of file objects will return the next line?

Python file method next() is used when a file is used as an iterator, typically in a loop, the next() method is called repeatedly. This method returns the next input line, or raises StopIteration when EOF is hit.

How do you go to the next line in Python?

The new line character in Python is \n .


1 Answers

This may approach what you're looking for and shouldn't be as expensive as the sed solution since AWK maintains a pointer into the file that getline opens.

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

The first block reads the first line and wastes it.

In this form, getline doesn't set any variables such as NR, FNR, NF or $0. It only sets the variable that you supply (nextline in this case).

See this for some additional information.

like image 105
Dennis Williamson Avatar answered Nov 20 '22 22:11

Dennis Williamson