Go to the first, previous, next, last section, table of contents.
print and printf
So far, the output from print and printf has gone
to the standard
output, usually the terminal. Both print and printf can
also send their output to other places.
This is called redirection.
A redirection appears after the print or printf statement.
Redirections in @command{awk} are written just like redirections in shell
commands, except that they are written inside the @command{awk} program.
There are four forms of output redirection: output to a file, output
appended to a file, output through a pipe to another command, and output
to a coprocess. They are all shown for the print statement,
but they work identically for printf:
print items > output-file
$ awk '{ print $2 > "phone-list"
> print $1 > "name-list" }' BBS-list
$ cat phone-list
-| 555-5553
-| 555-3412
...
$ cat name-list
-| aardvark
-| alpo-net
...
Each output file contains one name or number per line.
print items >> output-file
print items | command
awk '{ print $1 > "names.unsorted"
command = "sort -r > names.sorted"
print $1 | command }' BBS-list
The unsorted list is written with an ordinary redirection, while
the sorted list is written by piping through the @command{sort} utility.
The next example uses redirection to mail a message to the mailing
list `bug-system'. This might be useful when trouble is encountered
in an @command{awk} script run periodically for system maintenance:
report = "mail bug-system"
print "Awk script failed:", $0 | report
m = ("at record number " FNR " of " FILENAME)
print m | report
close(report)
The message is built using string concatenation and saved in the variable
m. It is then sent down the pipeline to the @command{mail} program.
(The parentheses group the items to concatenate--see
section String Concatenation.)
The close function is called here because it's a good idea to close
the pipe as soon as all the intended output has been sent to it.
See section Closing Input and Output Redirections,
for more information on this.
This example also illustrates the use of a variable to represent
a file or command---it is not necessary to always
use a string constant. Using a variable is generally a good idea,
because @command{awk} requires that the string value be spelled identically
every time.
print items |& command
getline.
Thus command is a coprocess, that works together with,
but subsidiary to, the @command{awk} program.
This feature is a @command{gawk} extension, and is not available in
POSIX @command{awk}.
See section Two-Way Communications with Another Process,
for a more complete discussion.
Redirecting output using `>', `>>', `|', or `|&' asks the system to open a file, pipe, or coprocess, only if the particular file or command you specify has not already been written to by your program or if it has been closed since it was last written to.
It is a common error to use `>' redirection for the first print
to a file, and then to use `>>' for subsequent output:
# clear the file print "Don't panic" > "guide.txt" ... # append print "Avoid improbability generators" >> "guide.txt"
This is indeed how redirections must be used from the shell. But in
@command{awk}, it isn't necessary. In this kind of case, a program should
use `>' for all the print statements, since the output file
is only opened once.
@ifnotinfo
As mentioned earlier
(see section Points About getline to Remember),
many
@ifnottex
Many
@command{awk} implementations limit the number of pipelines that an @command{awk}
program may have open to just one! In @command{gawk}, there is no such limit.
@command{gawk} allows a program to
open as many pipelines as the underlying operating system permits.
A particularly powerful way to use redirection is to build command lines, and pipe them into the shell, @command{sh}. For example, suppose you have a list of files brought over from a system where all the file names are stored in uppercase, and you wish to rename them to have names in all lowercase. The following program is both simple and efficient:
{ printf("mv %s %s\n", $0, tolower($0)) | "sh" }
END { close("sh") }
The tolower function returns its argument string with all
uppercase characters converted to lowercase
(see section String Manipulation Functions).
The program builds up a list of command lines,
using the @command{mv} utility to rename the files.
It then sends the list to the shell for execution.
Go to the first, previous, next, last section, table of contents.