2.3 Other Command-Line Arguments

Any additional arguments on the command line are normally treated as input files to be processed in the order specified. However, an argument that has the form var=value, assigns the value value to the variable var—it does not specify a file at all. (See Assigning Variables on the Command Line.) In the following example, ‘count=1’ is a variable assignment, not a file name:

awk -f program.awk file1 count=1 file2

As a side point, should you really need to have awk process a file named count=1 (or any file whose name looks like a variable assignment), precede the file name with ‘./’, like so:

awk -f program.awk file1 ./count=1 file2

All the command-line arguments are made available to your awk program in the ARGV array (see Predefined Variables). Command-line options and the program text (if present) are omitted from ARGV. All other arguments, including variable assignments, are included. As each element of ARGV is processed, gawk sets ARGIND to the index in ARGV of the current element. (gawk makes the full command line, including program text and options, available in PROCINFO["argv"]; see Built-in Variables That Convey Information.)

Changing ARGC and ARGV in your awk program lets you control how awk processes the input files; this is described in more detail in Using ARGC and ARGV.

The distinction between file name arguments and variable-assignment arguments is made when awk is about to open the next input file. At that point in execution, it checks the file name to see whether it is really a variable assignment; if so, awk sets the variable instead of reading a file.

Therefore, the variables actually receive the given values after all previously specified files have been read. In particular, the values of variables assigned in this fashion are not available inside a BEGIN rule (see The BEGIN and END Special Patterns), because such rules are run before awk begins scanning the argument list.

The variable values given on the command line are processed for escape sequences (see Escape Sequences). (d.c.)

In some very early implementations of awk, when a variable assignment occurred before any file names, the assignment would happen before the BEGIN rule was executed. awk’s behavior was thus inconsistent; some command-line assignments were available inside the BEGIN rule, while others were not. Unfortunately, some applications came to depend upon this “feature.” When awk was changed to be more consistent, the -v option was added to accommodate applications that depended upon the old behavior.

The variable assignment feature is most useful for assigning to variables such as RS, OFS, and ORS, which control input and output formats, before scanning the data files. It is also useful for controlling state if multiple passes are needed over a data file. For example:

awk 'pass == 1  { pass 1 stuff }
     pass == 2  { pass 2 stuff }' pass=1 mydata pass=2 mydata

Given the variable assignment feature, the -F option for setting the value of FS is not strictly necessary. It remains for historical compatibility.

Quoting Shell Variables On The awk Command Line

Small awk programs are often embedded in larger shell scripts, so it’s worthwhile to understand some shell basics. Consider the following:

f=""
awk '{ print("hi") }' $f

In this case, awk reads from standard input instead of trying to open any command line files. To the unwary, this looks like awk is hanging.

However awk doesn’t see an explicit empty string. When a variable expansion is the null string, and it’s not quoted, the shell simply removes it from the command line. To demonstrate:

$ f=""
$ awk 'BEGIN { print ARGC }' $f
-| 1
$ awk 'BEGIN { print ARGC }' "$f"
-| 2