はじめに
awkはテキスト処理に特化した強力なコマンドであり、ログ解析やデータ整形の現場で頻繁に使われます。
その中でもprintfは出力フォーマットを細かく制御できる重要な機能です。
初学者にとってはprintとの違いや書式指定の考え方でつまずきやすいですが、一度理解すると作業効率が大きく向上します。
本記事では、初学者がつまずきやすいポイントに触れながら、実践的に理解できるよう解説していきます。
参考: GNU gawk
awkにおけるprintfの基本役割とprintとの違い
ファイル作成
cat << 'EOF' > input.txt
apple 100
banana 200
orange 150
EOF
実行コマンド
awk '{print $1, $2}' input.txt
実行結果
apple 100
banana 200
orange 150
実行コマンド
awk '{printf "%s : %d\n", $1, $2}' input.txt
実行結果
apple : 100
banana : 200
orange : 150
実行コマンド
awk '{printf "%-10s %5d\n", $1, $2}' input.txt
実行結果
apple 100
banana 200
orange 150
仕組み
| 項目 | printf | |
|---|---|---|
| 改行 | 自動で改行される | 自動改行されない(\nが必要) |
| 書式指定 | できない(単純出力) | 可能(%s, %d, 幅指定など) |
| 出力の柔軟性 | 低い | 高い(整形・桁揃えなどが可能) |
| 使いどころ | 簡単な出力 | フォーマットを整えたい場合 |
解説
printは簡単な出力向け、printfはC言語のように書式を細かく制御できるのが特徴です。
整形された出力が必要な場合はprintfを使います。
printfの基本構文と書式指定子の使い方(%s, %d, %f)
ファイル作成
cat << 'EOF' > input.txt
Alice 25 165.5
Bob 30 172.3
Charlie 22 180.0
EOF
実行コマンド
awk '{ printf("Name: %s | Age: %d | Height: %.1f\n", $1, $2, $3) }' input.txt
実行結果
Name: Alice | Age: 25 | Height: 165.5
Name: Bob | Age: 30 | Height: 172.3
Name: Charlie | Age: 22 | Height: 180.0
仕組み
| 要素 | 内容 | 例 |
|---|---|---|
| printf | 書式付きで出力する関数 | printf("...") |
| %s | 文字列を出力 | 名前(Alice) |
| %d | 整数を出力 | 年齢(25) |
| %f | 浮動小数点を出力 | 身長(165.5) |
| %.1f | 小数点以下1桁で表示 | 165.5 |
| $1, $2, $3 | フィールド参照 | $1=名前 |
解説
awk printfはフォーマットを指定して整形出力でき、桁数や表示形式を細かく制御できる。
特に%.nfを使うことで小数点以下の表示桁数を柔軟に調整できる。
桁揃え(左寄せ・右寄せ)とパディング設定
ファイル作成
cat << 'EOF' > input.txt
apple 50
banana 7
cherry 123
EOF
実行コマンド
awk '{ printf "%-10s %5d\n", $1, $2 }' input.txt
実行結果
apple 50
banana 7
cherry 123
実行コマンド
awk '{ printf "%10s %05d\n", $1, $2 }' input.txt
実行結果
apple 00050
banana 00007
cherry 00123
仕組み
| 書式 | 意味 | 例(apple) | 説明 |
|---|---|---|---|
| %-10s | 左寄せ・幅10文字 | apple_____ | 右側にスペースで埋める |
| %10s | 右寄せ・幅10文字 | _____apple | 左側にスペースで埋める |
| %5d | 右寄せ・幅5桁(数値) | ___50 | 数値を右寄せ |
| %05d | 0埋め・幅5桁(数値) | 00050 | 先頭を0で埋める |
解説
awk の printf を使うことで、文字列や数値を桁揃えして整形できます。
- や 0 を指定することで、左寄せやゼロパディングなど柔軟に制御できます。
小数点以下の表示桁数と四捨五入
ファイル作成
cat << 'EOF' > input.txt
3.14159
2.71828
1.23456
EOF
実行コマンド
awk '{ printf("%.2f\n", $1) }' input.txt
実行結果
3.14
2.72
1.23
実行コマンド
awk '{ printf("%.3f\n", $1) }' input.txt
実行結果
3.142
2.718
1.235
仕組み
| 要素 | 内容 | 説明 |
|---|---|---|
| awk | テキスト処理ツール | 行単位でデータを処理 |
| $1 | フィールド1 | 入力された数値 |
| printf | 書式指定出力 | C言語風フォーマット |
| %.2f | 小数点以下2桁 | 四捨五入して表示 |
| %.3f | 小数点以下3桁 | 指定桁で丸める |
解説
printfのフォーマット指定子(例: %.2f)により、小数点以下の桁数を制御しつつ自動的に四捨五入されます。
awkは各行を処理するため、複数データの整形に適しています。
エスケープシーケンスの活用(改行・タブ・特殊文字の制御)
ファイル作成
cat << 'EOF' > input.txt
Hello\tWorld
Line1\nLine2
Price: \$100
EOF
実行コマンド
awk '{ gsub(/\\t/,"\t"); gsub(/\\n/,"\n"); gsub(/\\\$/,"$"); printf "%s\n", $0 }' input.txt
実行結果
Hello World
Line1
Line2
Price: $100
仕組み
| 要素 | 内容 |
|---|---|
| gsub | 文字列置換を行う関数 |
| /\\t/ | 「\t」という文字列を検出 |
| "\t" | 実際のタブ文字に変換 |
| /\\n/ | 「\n」という文字列を検出 |
| "\n" | 実際の改行に変換 |
| /\\\$/ | 「$」を検出 |
| "$" | $として出力 |
| printf "%s\n" | そのまま整形して出力 |
解説
BSD awkでは%bが使えないため、gsubで個別にエスケープシーケンスを展開します。
これにより、GNU awkに依存せず同様の出力が可能になります。
変数を用いた柔軟な出力レイアウト
ファイル作成
cat << 'EOF' > input.txt
Alice 80
Bob 95
Charlie 70
EOF
実行コマンド
awk '{ printf "Name: %-10s | Score: %3d\n", $1, $2 }' input.txt
実行結果
Name: Alice | Score: 80
Name: Bob | Score: 95
Name: Charlie | Score: 70
仕組み
| 要素 | 内容 |
|---|---|
| $1, $2 | 1列目・2列目のフィールドを取得 |
| printf | 書式指定で整形して出力 |
| %-10s | 左寄せで10文字幅の文字列 |
| %3d | 3桁幅で整数を右寄せ表示 |
| \n | 改行 |
解説
awkのprintfを使うことで、列幅や揃え方を細かく制御できる。
これにより表形式のような見やすい出力が可能になる。
CSVデータをレポート形式に変換する手法
ファイル作成
cat << 'EOF' > input.txt
name,age,score
Alice,23,85
Bob,30,92
Charlie,28,78
EOF
実行コマンド
awk -F',' 'NR>1 { printf "名前: %-10s 年齢: %-3s 点数: %-3s\n", $1, $2, $3 }' input.txt
実行結果
名前: Alice 年齢: 23 点数: 85
名前: Bob 年齢: 30 点数: 92
名前: Charlie 年齢: 28 点数: 78
仕組み
| 要素 | 内容 |
|---|---|
| -F',' | フィールド区切りをカンマに指定 |
| NR>1 | 1行目(ヘッダ)を除外 |
| $1,$2,$3 | CSVの各列(name, age, score) |
| printf | 書式を指定して整形出力 |
| %-10s | 左寄せで10文字分確保 |
| %-3s | 左寄せで3文字分確保 |
解説
awkのprintfを使うことで、CSVデータを整形されたレポート形式に変換できます。
列幅や配置を制御できるため、見やすい出力が可能です。
日本語(マルチバイト文字)使用時の表示崩れを防ぐ対策
ファイル作成
cat << 'EOF' > input.txt
りんご 100
バナナ 200
みかん 300
EOF
実行コマンド
awk '{ printf "%-10s %5d\n", $1, $2 }' input.txt
実行結果
りんご 100
バナナ 200
みかん 300
実行コマンド
awk 'BEGIN{ OFS="\t" } { printf "%s\t%d\n", $1, $2 }' input.txt
実行結果
りんご 100
バナナ 200
みかん 300
仕組み
| 要素 | 内容 |
|---|---|
| awk | テキストを行・列単位で処理するコマンド |
| printf | 書式指定で整形出力する(桁揃え可能) |
| %-10s | 文字列を左寄せで10文字幅に揃える |
| %5d | 数値を右寄せで5桁に揃える |
| 問題点 | 日本語はマルチバイトのため幅がずれる |
| 対策 | タブ区切りや固定幅を使い、見た目のズレを軽減 |
解説
awk printfは便利ですが、日本語は文字幅が一定でないためズレが発生します。
タブ区切りや十分な幅指定を使うことで表示崩れを抑えられます。
外部コマンド(column, sort)と連携した高度な整形ワークフロー
ファイル作成
cat << 'EOF' > input.txt
apple 120 3
banana 80 5
orange 150 2
grape 200 4
EOF
実行コマンド
awk '{ printf "%-10s %5d %5d\n", $1, $2, $3 }' input.txt | sort -k2 -n
実行結果
banana 80 5
apple 120 3
orange 150 2
grape 200 4
実行コマンド
awk '{ printf "%-10s %5d %5d\n", $1, $2, $3 }' input.txt | sort -k2 -n | column -t
実行結果
banana 80 5
apple 120 3
orange 150 2
grape 200 4
仕組み
| ステップ | コマンド要素 | 役割 |
|---|---|---|
| 1 | awk printf | 列幅を指定して整形(左寄せ・右寄せ) |
| 2 | sort -k2 -n | 2列目(数値)で昇順ソート |
| 3 | column -t | 空白区切りを元に表形式へ整形 |
解説
awkのprintfでフォーマットを固定し、sortで並び替え、columnで視認性を向上させることで高度な整形が可能になります。
シンプルなコマンド連携でレポート風の出力を実現できます。
大量ログ解析を効率化するprintfデバッグとパフォーマンスの最適化
ファイル作成
cat << 'EOF' > input.txt
2026-04-26 10:00:01 INFO user_id=101 action=login time=120
2026-04-26 10:00:02 INFO user_id=102 action=logout time=30
2026-04-26 10:00:03 INFO user_id=103 action=login time=200
2026-04-26 10:00:04 INFO user_id=101 action=login time=150
EOF
実行コマンド
awk '{ printf "USER:%s ACTION:%s TIME:%sms\n", $4, $5, $6 }' input.txt
実行結果
USER:user_id=101 ACTION:action=login TIME:time=120ms
USER:user_id=102 ACTION:action=logout TIME:time=30ms
USER:user_id=103 ACTION:action=login TIME:time=200ms
USER:user_id=101 ACTION:action=login TIME:time=150ms
実行コマンド
awk '{ split($6,a,"="); total+=a[2] } END { printf "TOTAL TIME: %dms\n", total }' input.txt
実行結果
TOTAL TIME: 500ms
実行コマンド
awk '$5=="action=login" { printf "%s %s\n", $4, $6 }' input.txt
実行結果
user_id=101 time=120
user_id=103 time=200
user_id=101 time=150
仕組み
| 要素 | 内容 |
|---|---|
| awk | テキストを1行ずつ処理するストリーム処理ツール |
| printf | フォーマット指定で高速かつ整形された出力 |
| split | 文字列を分割して値だけ抽出 |
| 条件式 | 必要なログだけを高速にフィルタ |
| 累積変数 | total+=でパフォーマンス集計 |
解説
awkのprintfを使うことでログ整形とデバッグを同時に高速実行できる。
不要なログを除外しつつ集計することで、大量ログ解析の効率が大幅に向上する。
awkとprintfを活用した実践的データ整形のまとめ
awkとprintfを組み合わせることで、単なるテキスト処理を超えた高度なデータ整形が可能になります。
printとの違いを理解し、書式指定子や桁揃え、小数点制御を使いこなすことで、出力の質は大きく向上します。さらにエスケープシーケンスや変数、外部コマンドとの連携を取り入れることで、実務レベルの処理にも対応できるようになります。
初学者のうちは一つずつ試しながら理解を深めることが、確実なスキル習得への近道です。

![[sed] 実行して理解 指定した範囲の行を削除 文字列のsed](https://running-terminal-commands.com/wp-content/uploads/thumbnail_sed_1920_1080.png)