[ < ] | [ > ] | [ << ] | [ 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] | [ ? ] |