manpagez: man pages & more
info gawk
Home | html | info | man

File: gawk.info,  Node: Nonconstant Fields,  Next: Fields.php">Changing Fields,  Prev: Fields,  Up: Reading Files

4.3 Nonconstant Field Numbers
=============================

A field number need not be a constant.  Any expression in the 'awk'
language can be used after a '$' to refer to a field.  The value of the
expression specifies the field number.  If the value is a string, rather
than a number, it is converted to a number.  Consider this example:

     awk '{ print $NR }'

Recall that 'NR' is the number of records read so far: one in the first
record, two in the second, and so on.  So this example prints the first
field of the first record, the second field of the second record, and so
on.  For the twentieth record, field number 20 is printed; most likely,
the record has fewer than 20 fields, so this prints a blank line.  Here
is another example of using expressions as field numbers:

     awk '{ print $(2*2) }' mail-list

   'awk' evaluates the expression '(2*2)' and uses its value as the
number of the field to print.  The '*' represents multiplication, so the
expression '2*2' evaluates to four.  The parentheses are used so that
the multiplication is done before the '$' operation; they are necessary
whenever there is a binary operator(1) in the field-number expression.
This example, then, prints the type of relationship (the fourth field)
for every line of the file 'mail-list'.  (All of the 'awk' operators are
listed, in order of decreasing precedence, in *note Precedence::.)

   If the field number you compute is zero, you get the entire record.
Thus, '$(2-2)' has the same value as '$0'.  Negative field numbers are
not allowed; trying to reference one usually terminates the program.
(The POSIX standard does not define what happens when you reference a
negative field number.  'gawk' notices this and terminates your program.
Other 'awk' implementations may behave differently.)

   As mentioned in *note Fields::, 'awk' stores the current record's
number of fields in the built-in variable 'NF' (also *note Built-in
Variables::).  Thus, the expression '$NF' is not a special feature--it
is the direct consequence of evaluating 'NF' and using its value as a
field number.

   ---------- Footnotes ----------

   (1) A "binary operator", such as '*' for multiplication, is one that
takes two operands.  The distinction is required because 'awk' also has
unary (one-operand) and ternary (three-operand) operators.

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.