Next: , Previous: File Checking, Up: Data File Management



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 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.