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