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 will 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:
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. Note:Rearranging `printf' Arguments,
which describes how and why to use positional specifiers.
For now, we will not use them.
`-'
The minus sign, used before the width modifier (see further on in
this table), 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 further on in
this table), says to always supply a sign for numeric conversions,
even if the data to format is positive. The `+' overrides the
space modifier.
`#'
Use an "alternate 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', 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 that indicates that output
should be padded with zeros instead of spaces. This applies even
to non-numeric output formats. (d.c.) This flag only has an
effect when the field width is wider than the value to print.
`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:
`%e', `%E', `%f'
Number of digits to the right of the decimal point.
`%g', `%G'
Maximum number of significant digits.
`%d', `%i', `%o', `%u', `%x', `%X'
Minimum number of digits to print.
`%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 (for
example, `"%*.*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 `l', `L', and `h'
modifiers in `printf' format strings. These are not valid in `awk'.
Most `awk' implementations silently ignore these modifiers. If
`--lint' is provided on the command line (*note Command-Line Options:
Options.), `gawk' warns about their use. If `--posix' is supplied,
their use is a fatal error.