gawk: Format Modifiers

 
 5.5.3 Modifiers for 'printf' Formats
 ------------------------------------
 
 A format specification can also include "modifiers" that can control how
 much of the item's value is printed, as well as how much space it gets.
 The modifiers come between the '%' and the format-control letter.  We
 use the bullet symbol "*" in the following examples to represent spaces
 in the output.  Here are the possible modifiers, in the order in which
 they may appear:
 
 'N$'
      An integer constant followed by a '$' is a "positional specifier".
      Normally, format specifications are applied to arguments in the
      order given in the format string.  With a positional specifier, the
      format specification is applied to a specific argument, instead of
      what would be the next argument in the list.  Positional specifiers
      begin counting with one.  Thus:
 
           printf "%s %s\n", "don't", "panic"
           printf "%2$s %1$s\n", "panic", "don't"
 
      prints the famous friendly message twice.
 
      At first glance, this feature doesn't seem to be of much use.  It
      is in fact a 'gawk' extension, intended for use in translating
      messages at runtime.  SeePrintf Ordering, which describes how
      and why to use positional specifiers.  For now, we ignore them.
 
 '-' (Minus)
      The minus sign, used before the width modifier (see later on in
      this list), says to left-justify the argument within its specified
      width.  Normally, the argument is printed right-justified in the
      specified width.  Thus:
 
           printf "%-4s", "foo"
 
      prints 'foo*'.
 
 SPACE
      For numeric conversions, prefix positive values with a space and
      negative values with a minus sign.
 
 '+'
      The plus sign, used before the width modifier (see later on in this
      list), says to always supply a sign for numeric conversions, even
      if the data to format is positive.  The '+' overrides the space
      modifier.
 
 '#'
      Use an "alternative form" for certain control letters.  For '%o',
      supply a leading zero.  For '%x' and '%X', supply a leading '0x' or
      '0X' for a nonzero result.  For '%e', '%E', '%f', and '%F', the
      result always contains a decimal point.  For '%g' and '%G',
      trailing zeros are not removed from the result.
 
 '0'
      A leading '0' (zero) acts as a flag indicating that output should
      be padded with zeros instead of spaces.  This applies only to the
      numeric output formats.  This flag only has an effect when the
      field width is wider than the value to print.
 
 '''
      A single quote or apostrophe character is a POSIX extension to ISO
      C. It indicates that the integer part of a floating-point value, or
      the entire part of an integer decimal value, should have a
      thousands-separator character in it.  This only works in locales
      that support such characters.  For example:
 
           $ cat thousands.awk          Show source program
           -| BEGIN { printf "%'d\n", 1234567 }
           $ LC_ALL=C gawk -f thousands.awk
           -| 1234567                   Results in "C" locale
           $ LC_ALL=en_US.UTF-8 gawk -f thousands.awk
           -| 1,234,567                 Results in US English UTF locale
 
      For more information about locales and internationalization issues,
      see SeeLocales.
 
           NOTE: The ''' flag is a nice feature, but its use complicates
           things: it becomes difficult to use it in command-line
           programs.  For information on appropriate quoting tricks, see
           SeeQuoting.
 
 WIDTH
      This is a number specifying the desired minimum width of a field.
      Inserting any number between the '%' sign and the format-control
      character forces the field to expand to this width.  The default
      way to do this is to pad with spaces on the left.  For example:
 
           printf "%4s", "foo"
 
      prints '*foo'.
 
      The value of WIDTH is a minimum width, not a maximum.  If the item
      value requires more than WIDTH characters, it can be as wide as
      necessary.  Thus, the following:
 
           printf "%4s", "foobar"
 
      prints 'foobar'.
 
      Preceding the WIDTH with a minus sign causes the output to be
      padded with spaces on the right, instead of on the left.
 
 '.PREC'
      A period followed by an integer constant specifies the precision to
      use when printing.  The meaning of the precision varies by control
      letter:
 
      '%d', '%i', '%o', '%u', '%x', '%X'
           Minimum number of digits to print.
 
      '%e', '%E', '%f', '%F'
           Number of digits to the right of the decimal point.
 
      '%g', '%G'
           Maximum number of significant digits.
 
      '%s'
           Maximum number of characters from the string that should
           print.
 
      Thus, the following:
 
           printf "%.4s", "foobar"
 
      prints 'foob'.
 
    The C library 'printf''s dynamic WIDTH and PREC capability (e.g.,
 '"%*.*s"') is supported.  Instead of supplying explicit WIDTH and/or
 PREC values in the format string, they are passed in the argument list.
 For example:
 
      w = 5
      p = 3
      s = "abcdefg"
      printf "%*.*s\n", w, p, s
 
 is exactly equivalent to:
 
      s = "abcdefg"
      printf "%5.3s\n", s
 
 Both programs output '**abc'.  Earlier versions of 'awk' did not support
 this capability.  If you must use such a version, you may simulate this
 feature by using concatenation to build up the format string, like so:
 
      w = 5
      p = 3
      s = "abcdefg"
      printf "%" w "." p "s\n", s
 
 This is not particularly easy to read, but it does work.
 
    C programmers may be used to supplying additional modifiers ('h',
 'j', 'l', 'L', 't', and 'z') in 'printf' format strings.  These are not
 valid in 'awk'.  Most 'awk' implementations silently ignore them.  If
 '--lint' is provided on the command line (SeeOptions), 'gawk' warns
 about their use.  If '--posix' is supplied, their use is a fatal error.