GNU Info

Info Node: (gawk.info)I/O And BEGIN/END

(gawk.info)I/O And BEGIN/END


Prev: Using BEGIN/END Up: BEGIN/END
Enter node , (file) or (file)node

Input/Output from `BEGIN' and `END' Rules
.........................................

   There are several (sometimes subtle) points to remember when doing
I/O from a `BEGIN' or `END' rule.  The first has to do with the value
of `$0' in a `BEGIN' rule.  Because `BEGIN' rules are executed before
any input is read, there simply is no input record, and therefore no
fields, when executing `BEGIN' rules.  References to `$0' and the fields
yield a null string or zero, depending upon the context.  One way to
give `$0' a real value is to execute a `getline' command without a
variable (Note: Explicit Input with `getline'.).  Another way
is to simply assign a value to `$0'.

   The second point is similar to the first but from the other
direction.  Traditionally, due largely to implementation issues, `$0'
and `NF' were _undefined_ inside an `END' rule.  The POSIX standard
specifies that `NF' is available in an `END' rule. It contains the
number of fields from the last input record.  Most probably due to an
oversight, the standard does not say that `$0' is also preserved,
although logically one would think that it should be.  In fact, `gawk'
does preserve the value of `$0' for use in `END' rules.  Be aware,
however, that Unix `awk', and possibly other implementations, do not.

   The third point follows from the first two.  The meaning of `print'
inside a `BEGIN' or `END' rule is the same as always: `print $0'.  If
`$0' is the null string, then this prints an empty line.  Many long
time `awk' programmers use an unadorned `print' in `BEGIN' and `END'
rules, to mean `print ""', relying on `$0' being null.  Although one
might generally get away with this in `BEGIN' rules, it is a very bad
idea in `END' rules, at least in `gawk'.  It is also poor style, since
if an empty line is needed in the output, the program should print one
explicitly.

   Finally, the `next' and `nextfile' statements are not allowed in a
`BEGIN' rule, because the implicit
read-a-record-and-match-against-the-rules loop has not started yet.
Similarly, those statements are not valid in an `END' rule, since all
the input has been read.  (Note: The `next' Statement,
and see Note: Using `gawk''s `nextfile' Statement.)


automatically generated by info2www version 1.2.2.9