gawk: Using BEGIN/END
7.1.4.1 Startup and Cleanup Actions
...................................
A 'BEGIN' rule is executed once only, before the first input record is
read. Likewise, an 'END' rule is executed once only, after all the
input is read. For example:
$ awk '
> BEGIN { print "Analysis of \"li\"" }
> /li/ { ++n }
> END { print "\"li\" appears in", n, "records." }' mail-list
-| Analysis of "li"
-| "li" appears in 4 records.
This program finds the number of records in the input file
'mail-list' that contain the string 'li'. The 'BEGIN' rule prints a
title for the report. There is no need to use the 'BEGIN' rule to
initialize the counter 'n' to zero, as 'awk' does this automatically
(Variables). The second rule increments the variable 'n' every
time a record containing the pattern 'li' is read. The 'END' rule
prints the value of 'n' at the end of the run.
The special patterns 'BEGIN' and 'END' cannot be used in ranges or
with Boolean operators (indeed, they cannot be used with any operators).
An 'awk' program may have multiple 'BEGIN' and/or 'END' rules. They are
executed in the order in which they appear: all the 'BEGIN' rules at
startup and all the 'END' rules at termination. 'BEGIN' and 'END' rules
may be intermixed with other rules. This feature was added in the 1987
version of 'awk' and is included in the POSIX standard. The original
(1978) version of 'awk' required the 'BEGIN' rule to be placed at the
beginning of the program, the 'END' rule to be placed at the end, and
only allowed one of each. This is no longer required, but it is a good
idea to follow this template in terms of program organization and
readability.
Multiple 'BEGIN' and 'END' rules are useful for writing library
functions, because each library file can have its own 'BEGIN' and/or
'END' rule to do its own initialization and/or cleanup. The order in
which library functions are named on the command line controls the order
in which their 'BEGIN' and 'END' rules are executed. Therefore, you
have to be careful when writing such rules in library files so that the
order in which they are executed doesn't matter. Options for
more information on using library functions. Library Functions,
for a number of useful library functions.
If an 'awk' program has only 'BEGIN' rules and no other rules, then
the program exits after the 'BEGIN' rules are run.(1) However, if an
'END' rule exists, then the input is read, even if there are no other
rules in the program. This is necessary in case the 'END' rule checks
the 'FNR' and 'NR' variables.
---------- Footnotes ----------
(1) The original version of 'awk' kept reading and ignoring input
until the end of the file was seen.