| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
12.3.4 Checking For Zero-length Files
All known awk implementations silently skip over zero-length files.
This is a by-product of awk’s implicit
read-a-record-and-match-against-the-rules loop: when awk
tries to read a record from an empty file, it immediately receives an
end of file indication, closes the file, and proceeds on to the next
command-line data file, without executing any user-level
awk program code.
Using gawk’s ARGIND variable
(see section Built-in Variables), it is possible to detect when an empty
data file has been skipped. Similar to the library file presented
in Noting Data File Boundaries, the following library file calls a function named
zerofile() that the user must provide. The arguments passed are
the file name and the position in ARGV where it was found:
# zerofile.awk --- library file to process empty input files
BEGIN { Argind = 0 }
ARGIND > Argind + 1 {
for (Argind++; Argind < ARGIND; Argind++)
zerofile(ARGV[Argind], Argind)
}
ARGIND != Argind { Argind = ARGIND }
END {
if (ARGIND > Argind)
for (Argind++; Argind <= ARGIND; Argind++)
zerofile(ARGV[Argind], Argind)
}
|
The user-level variable Argind allows the awk program
to track its progress through ARGV. Whenever the program detects
that ARGIND is greater than ‘Argind + 1’, it means that one or
more empty files were skipped. The action then calls zerofile() for
each such file, incrementing Argind along the way.
The ‘Argind != ARGIND’ rule simply keeps Argind up to date
in the normal case.
Finally, the END rule catches the case of any empty files at
the end of the command-line arguments. Note that the test in the
condition of the for loop uses the ‘<=’ operator,
not ‘<’.
As an exercise, you might consider whether this same problem can
be solved without relying on gawk’s ARGIND variable.
As a second exercise, revise this code to handle the case where
an intervening value in ARGV is a variable assignment.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
