gawk: Plain Getline
4.10.1 Using 'getline' with No Arguments
----------------------------------------
The 'getline' command can be used without arguments to read input from
the current input file. All it does in this case is read the next input
record and split it up into fields. This is useful if you've finished
processing the current record, but want to do some special processing on
the next record _right now_. For example:
# Remove text between /* and */, inclusive
{
if ((i = index($0, "/*")) != 0) {
out = substr($0, 1, i - 1) # leading part of the string
rest = substr($0, i + 2) # ... */ ...
j = index(rest, "*/") # is */ in trailing part?
if (j > 0) {
rest = substr(rest, j + 2) # remove comment
} else {
while (j == 0) {
# get more text
if (getline <= 0) {
print("unexpected EOF or error:", ERRNO) > "/dev/stderr"
exit
}
# build up the line using string concatenation
rest = rest $0
j = index(rest, "*/") # is */ in trailing part?
if (j != 0) {
rest = substr(rest, j + 2)
break
}
}
}
# build up the output line using string concatenation
$0 = out rest
}
print $0
}
This 'awk' program deletes C-style comments ('/* ... */') from the
input. It uses a number of features we haven't covered yet, including
string concatenation (Concatenation) and the 'index()' and
'substr()' built-in functions (String Functions). By replacing
the 'print $0' with other statements, you could perform more complicated
processing on the decommented input, such as searching for matches of a
regular expression. (This program has a subtle problem--it does not
work if one comment ends and another begins on the same line.)
This form of the 'getline' command sets 'NF', 'NR', 'FNR', 'RT', and
the value of '$0'.
NOTE: The new value of '$0' is used to test the patterns of any
subsequent rules. The original value of '$0' that triggered the
rule that executed 'getline' is lost. By contrast, the 'next'
statement reads a new record but immediately begins processing it
normally, starting with the first rule in the program. Next
Statement.