Node:Field Splitting Summary, Previous:Command Line Field Separator, Up:Field Separators
The following
table
summarizes how fields are split, based on the
value of FS
(==
means "is equal to"):
FS == " "
FS == any other single character
FS == regexp
FS == ""
gawk
extension; it is not specified by the
POSIX standard.)
FS
Does Not Affect the FieldsAccording to the POSIX standard, awk
is supposed to behave
as if each record is split into fields at the time it is read.
In particular, this means that if you change the value of FS
after a record is read, the value of the fields (i.e., how they were split)
should reflect the old value of FS
, not the new one.
However, many implementations of awk
do not work this way. Instead,
they defer splitting the fields until a field is actually
referenced. The fields are split
using the current value of FS
!
(d.c.)
This behavior can be difficult
to diagnose. The following example illustrates the difference
between the two methods.
(The sed
1
command prints just the first line of /etc/passwd
.)
sed 1q /etc/passwd | awk '{ FS = ":" ; print $1 }'
which usually prints:
root
on an incorrect implementation of awk
, while gawk
prints something like:
root:nSijPlPhZZwgE:0:0:Root:/: