Copyright (C) 2000-2012 |
GNU Info (gawk.info)I/O And BEGIN/ENDInput/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 |