Peek at next line, but don't consume it

awk, gawk

Solution

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.

Problem

`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.

Original source