Node:Format Modifiers, Next:, Previous:Control Letters, Up:Printf

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:

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. See 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 later 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•.

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 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.
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.
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.

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.
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 (see Command-Line Options), gawk warns about their use. If --posix is supplied, their use is a fatal error.