Node:Format Modifiers, Next:Printf Examples, Previous:Control Letters, Up:Printf
printf
FormatsA 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$
$
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.
See Rearranging printf
Arguments,
which describes how and why to use positional specifiers.
For now, we will not use them.
-
printf "%-4s", "foo"
prints foo
.
space
+
+
overrides the space modifier.
#
%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
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
%
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
%e
, %E
, %f
%g
, %G
%d
, %i
, %o
, %u
, %x
, %X
%s
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
(see Command-Line Options),
gawk
warns about their use. If --posix
is supplied,
their use is a fatal error.