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.
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.
The new line character in Python is \n .
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With