Gawk/Format-Modifiers
Next: Printf Examples, Previous: Control Letters, Up: Printf [Contents][Index]
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.
See section Rearranging printf
Arguments,
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 Where You Are Makes a Difference.
NOTE: The ‘
'
’ flag is a nice feature, but its use complicates things: itbecomes difficult to use it in command-line programs. For information on appropriate quoting tricks, see Shell Quoting Issues.
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 (see section Command-Line Options), gawk
warns about their
use. If --posix
is supplied, their use is a fatal error.
Next: Printf Examples, Previous: Control Letters, Up: Printf [Contents][Index]