One-Line Programs in awk
We have now covered enough awk to do useful things with as little as one line of code; few other programming languages can do so much with so little. In this section, we present some examples of these one-liners, although page-width limitations sometimes force us to wrap them onto more than one line. In some of the examples, we show multiple ways to program a solution in awk, or with other Unix tools:
We start with a simple implementation in awk of the Unix word-count utility, wc:
awk '{ C += length($0) + 1; W += NF } END { print NR, W, C }'
Notice that pattern/action groups need not be separated by newlines, even though we usually do that for readability. Although we could have included an initialization block of the form
BEGIN { C = W = 0 }
, awk's guaranteed default initializations make it unnecessary. The character count inC
is updated at each record to count the record length, plus the newline that is the default record separator. The word count inW
accumulates the number of fields. We do not need to keep a line-count variable because the built-in record count,NR
, automatically tracks that information for us. TheEND
action handles the printing of the one-line report that wc produces.awk exits immediately without reading any input if its program is empty, so it can match cat as an efficient data sink:
$time cat *.xml > /dev/null
0.035u 0.121s 0:00.21 71.4% 0+0k 0+0io 99pf+0w $time awk '' *.xml
0.136u 0.051s 0:00.21 85.7% 0+0k 0+0io 140pf+0w
Apart ...
Get Classic Shell Scripting now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.