Go to the first, previous, next, last section, table of contents.

printfの使用例

次に、printfを使って桁揃えされた表を作成する方法を示します。

awk '{ printf "%-10s %s\n", $1, $2 }' BBS-list

これは、`BBS-list'ファイルの電子掲示版名($1)を、10文字の文字列として左揃えで表示します。また、電話番号($2)を同じ行のうしろに表示します。これで、桁揃えされた2欄の、名前と電話番号の表が出力されます。

aardvark   555-5553
alpo-net   555-3412
barfly     555-7685
bites      555-1675
camelot    555-0542
core       555-2912
fooey      555-1234
foot       555-6699
macfoo     555-6480
sdace      555-3430
sabafoo    555-2127

電話番号を数として表示するように指定しなかったことに気付きましたか? 電話番号はダッシュで区切られているので、文字列として表示しなければならないのです。電話番号を数として表示しようとすると、ダッシュは負符号として解釈されます。その場合、結果はかなり混乱したものになります。

電話番号に対しては幅を指定しませんでしたが、これは、電話番号は行の最後の項目だからです。電話番号のあとにはスペースを付ける必要はありません。

欄の上部に標題をつければ、もっと見栄えの良い表になります。これには、次のようにawkプログラムの先頭でBEGINパターン(see section 特別なパターンBEGINおよびEND)を使って、標題を1度だけ表示するようにしてください。

awk 'BEGIN { print "Name      Number"
             print "----      ------" }
     { printf "%-10s %s\n", $1, $2 }' BBS-list

この例で、print文とprintf文を組み合わせて使っていることに気付きましたか? 次のようにprintf文だけでこれと同じ結果を得ることもできます。

awk 'BEGIN { printf "%-10s %s\n", "Name", "Number"
             printf "%-10s %s\n", "----", "------" }
     { printf "%-10s %s\n", $1, $2 }' BBS-list

各欄の標題を、欄の要素と同じ書式指定で出力して、表題も欄と同じように確実に桁揃えされるようにしています。

同じ書式指定が3回使われているという事実は、次のように書式指定を変数に格納することにより強調できます。

awk 'BEGIN { format = "%-10s %s\n"
             printf format, "Name", "Number"
             printf format, "----", "------" }
     { printf format, $1, $2 }' BBS-list

ためしに、前のprint文(see section print)の節で説明した`inventory-shipped'の例の、表題と表のデータをprintf文でそろえてみてください。


Go to the first, previous, next, last section, table of contents.