gawk: Empty Files
10.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 (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 '<'.