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

File: gawk.info,  Node: Uninitialized Subscripts,  Next: Delete,  Prev: Numeric Array Subscripts,  Up: Arrays

8.3 Using Uninitialized Variables as Subscripts
===============================================

Suppose it's necessary to write a program to print the input data in
reverse order.  A reasonable attempt to do so (with some test data)
might look like this:

     $ echo 'line 1
     > line 2
     > line 3' | awk '{ l[lines] = $0; ++lines }
     > END {
     >     for (i = lines - 1; i >= 0; i--)
     >        print l[i]
     > }'
     -| line 3
     -| line 2

   Unfortunately, the very first line of input data did not appear in
the output!

   Upon first glance, we would think that this program should have
worked.  The variable 'lines' is uninitialized, and uninitialized
variables have the numeric value zero.  So, 'awk' should have printed
the value of 'l[0]'.

   The issue here is that subscripts for 'awk' arrays are _always_
strings.  Uninitialized variables, when used as strings, have the value
'""', not zero.  Thus, 'line 1' ends up stored in 'l[""]'.  The
following version of the program works correctly:

     { l[lines++] = $0 }
     END {
         for (i = lines - 1; i >= 0; i--)
            print l[i]
     }

   Here, the '++' forces 'lines' to be numeric, thus making the "old
value" numeric zero.  This is then converted to '"0"' as the array
subscript.

   Even though it is somewhat unusual, the null string ('""') is a valid
array subscript.  (d.c.)  'gawk' warns about the use of the null string
as a subscript if '--lint' is provided on the command line (*note
Options::).

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