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 Built-in Variables), it is possible to detect when an empty
data file has been skipped. Similar to the library file presented
in Filetrans Function, 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.