はじめに
awkはテキスト処理を効率よく行える強力なコマンドですが、初学者がつまずきやすいポイントのひとつが「区切り文字の扱い」です。
特にofsという概念は、入力の分割だけでなく出力フォーマットにも関係しており、理解が曖昧なまま使っているケースが少なくありません。
本記事ではawkが列をどのように扱うのか、ofsがどのタイミングで作用するのかを丁寧に解説し、実務で使える応用テクニックまでをまとめます。
参考: GNU awk
awkが列を区切る仕組み
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
dog cat mouse
EOF
実行コマンド
awk '{print $1, $2, $3}' input.txt
実行結果
apple orange banana
dog cat mouse
実行コマンド
awk 'BEGIN{OFS=","} {print $1, $2, $3}' input.txt
実行結果
apple,orange,banana
dog,cat,mouse
仕組み
| 項目 | 内容 |
|---|---|
| FS | 入力フィールド区切り(デフォルトは空白) |
| OFS | 出力フィールド区切り(デフォルトは空白) |
| $1, $2... | フィールド単位でデータを取得 |
| フィールド間にOFSを挿入して出力 |
解説
awkは入力時はFSで分割し、出力時はOFSで結合します。
OFSを変更することで区切り文字を自由に制御できます。
デフォルトのOFSと「スペース1つ」の挙動
ファイル作成
cat << 'EOF' > input.txt
A B C
1 2 3
EOF
実行コマンド
awk '{print $1, $2, $3}' input.txt
実行結果
A B C
1 2 3
実行コマンド
awk 'BEGIN{OFS=" "} {print $1, $2, $3}' input.txt
実行結果
A B C
1 2 3
実行コマンド
awk 'BEGIN{OFS=","} {print $1, $2, $3}' input.txt
実行結果
A,B,C
1,2,3
仕組み
| 項目 | 内容 |
|---|---|
| OFS | Output Field Separator(出力フィールド区切り文字) |
| デフォルト値 | スペース1つ " " |
| print $1, $2 の挙動 | フィールド間にOFSが自動挿入される |
| OFS=" " | デフォルトと同じ(明示指定) |
| OFS="," | カンマ区切りで出力される |
解説
デフォルトのawkはOFSに「スペース1つ」を使うため、特に指定しなくても空白区切りになります。OFSを変更することで、出力フォーマットを柔軟に制御できます。
OFSが発動する条件
ファイル作成
cat << 'EOF' > input.txt
a b c
1 2 3
EOF
実行コマンド
awk '{print $1, $2, $3}' input.txt
実行結果
a b c
1 2 3
実行コマンド
awk 'BEGIN{OFS=","} {print $1, $2, $3}' input.txt
実行結果
a,b,c
1,2,3
実行コマンド
awk '{print $1 "-" $2 "-" $3}' input.txt
実行結果
a-b-c
1-2-3
仕組み
| 条件 | OFSの影響 | 説明 |
|---|---|---|
| print $1, $2 のようにカンマ区切り | 影響あり | フィールド間の区切りにOFSが使われる |
| BEGIN{OFS=","} を指定 | 有効化 | 出力時の区切り文字を変更 |
| $1 "-" $2 のように文字列連結 | 影響なし | 連結は単一文字列として扱われるためOFSは使われない |
解説
OFSは「printで複数フィールドをカンマ区切りで出力したとき」にのみ適用されます。
文字列連結の場合は単なる1つの値になるため、OFSは関与しません。
主要な区切り文字の指定方法
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
cat dog mouse
red blue green
EOF
実行コマンド
awk '{print $1, $2, $3}' input.txt
実行結果
apple orange banana
cat dog mouse
red blue green
実行コマンド
awk 'BEGIN{OFS=","} {print $1, $2, $3}' input.txt
実行結果
apple,orange,banana
cat,dog,mouse
red,blue,green
仕組み
| 項目 | 内容 |
|---|---|
| OFS | Output Field Separator(出力フィールド区切り文字) |
| デフォルト | スペース |
| 設定方法 | BEGIN{OFS="区切り文字"} |
| 影響範囲 | printでカンマ区切りした項目間に適用 |
| 注意点 | $1 $2 のようにカンマ無しでは適用されない |
解説
OFSはprintでカンマ区切りしたときの出力区切り文字を変更するための変数です。CSV形式などに変換する際によく使われます。
マルチバイト文字や記号を区切り文字に設定する
ファイル作成
cat << 'EOF' > input.txt
apple banana cherry
dog elephant fox
EOF
実行コマンド
awk 'BEGIN{OFS="★"} {print $1,$2,$3}' input.txt
実行結果
apple★banana★cherry
dog★elephant★fox
実行コマンド
awk 'BEGIN{OFS="あいう"} {print $1,$2,$3}' input.txt
実行結果
appleあいうbananaあいうcherry
dogあいうelephantあいうfox
仕組み
| 要素 | 内容 |
|---|---|
| OFS | 出力フィールド区切り文字(Output Field Separator) |
| BEGIN | 入力処理前に一度だけ実行されるブロック |
| $1,$2,$3 | 各フィールド(空白区切り) |
| フィールドをOFSで連結して出力 | |
| マルチバイト文字 | OFSに日本語や記号も設定可能 |
解説
OFSは出力時の区切り文字を指定し、日本語や記号などのマルチバイト文字も問題なく使用できます。これにより柔軟なフォーマット出力が可能です。
$0を再構築してOFSを強制的に適用させるテクニック
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
dog cat mouse
EOF
実行コマンド
awk 'BEGIN{OFS=","} {$1=$1; print}' input.txt
実行結果
apple,orange,banana
dog,cat,mouse
仕組み
| 要素 | 内容 |
|---|---|
| OFS | 出力フィールド区切り文字(Output Field Separator) |
| $1=$1 | フィールドを再代入し、$0 を再構築させるトリガー |
| $0 | 行全体(再構築時に OFS が適用される) |
| 再構築された $0 を出力 |
解説
$1=$1 によって awk が行を再構築し、その際に OFS が強制適用されます。
これにより入力区切りに関係なく出力形式を統一できます。
NF(フィールド数)の操作による出力制御とOFSの関係
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
cat dog
red blue green yellow
EOF
実行コマンド
awk '{print $1, $2}' input.txt
実行結果
apple orange
cat dog
red blue
実行コマンド
awk 'BEGIN{OFS=","} {print $1, $2}' input.txt
実行結果
apple,orange
cat,dog
red,blue
実行コマンド
awk '{NF=1; print $0}' input.txt
実行結果
apple
cat
red
実行コマンド
awk 'BEGIN{OFS="-"} {NF=2; print $0}' input.txt
実行結果
apple-orange
cat-dog
red-blue
仕組み
| 要素 | 説明 | 動作 |
|---|---|---|
| NF | フィールド数(列数) | 値を変更すると出力対象のフィールド数が変わる |
| $1, $2 | 各フィールド | 指定した列のみ出力 |
| OFS | 出力フィールド区切り | print時の区切り文字を制御 |
| NF=1 | フィールド削減 | 1列目のみ残し、それ以外を削除 |
| NF=2 | フィールド調整 | 2列までに制限し再構築 |
| print $0 | 行全体 | NF変更後の内容が再構成されて出力 |
解説
NFを書き換えるとawkはレコードを再構築し、その際にOFSが区切りとして使われます。
つまりNF操作とOFSは連動して出力フォーマットを決定します。
ORS(出力レコードセパレーター)と組み合わせた柔軟な改行制御
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
cat dog elephant
red blue green
EOF
実行コマンド
awk 'BEGIN{ORS=" | "} {for(i=1;i<=NF;i++) print $i}' input.txt
実行結果
apple | orange | banana | cat | dog | elephant | red | blue | green |
実行コマンド
awk 'BEGIN{OFS=", "; ORS="\n---\n"} {$1=$1; print}' input.txt
実行結果
apple, orange, banana
---
cat, dog, elephant
---
red, blue, green
---
仕組み
| 要素 | 役割 | 説明 |
|---|---|---|
| ORS | 出力レコードセパレーター | printごとの区切り文字を変更し、改行や任意文字列を制御 |
| OFS | 出力フィールドセパレーター | フィールド間の区切り文字を指定 |
| NF | フィールド数 | ループ処理で全フィールドを扱うために使用 |
| $1=$1 | 再構築トリガー | OFSを反映させて行全体を再出力 |
解説
ORSを使うことで改行を含めた出力形式を柔軟に制御でき、OFSと組み合わせると整形の自由度が大きく向上します。
特にログ整形やワンライナー処理で強力に機能します。
定型フォーマットと動的区切り
ファイル作成
cat << 'EOF' > input.txt
apple 100 red
banana 200 yellow
grape 300 purple
EOF
実行コマンド
awk 'BEGIN{OFS=","} {print $1, $2, $3}' input.txt
実行結果
apple,100,red
banana,200,yellow
grape,300,purple
実行コマンド
awk 'BEGIN{OFS=" | "} {OFS="-"; print $1, $2, $3}' input.txt
実行結果
apple-100-red
banana-200-yellow
grape-300-purple
仕組み
| 要素 | 内容 |
|---|---|
| awk | テキスト処理ツール |
| BEGIN{} | 処理開始前に一度だけ実行 |
| OFS | 出力フィールド区切り文字(Output Field Separator) |
| $1,$2,$3 | 各列(フィールド)を指定 |
| 指定フィールドを出力 | |
| 動的区切り | OFSを変更することで出力フォーマットを柔軟に変更可能 |
解説
OFSを設定することで、出力時の区切り文字を自由に変更できます。
これにより同じデータから異なるフォーマットを簡単に生成できます。
空文字の設定によるフィールドの結合処理
ファイル作成
cat << 'EOF' > input.txt
A 1
B 2
C 3
EOF
実行コマンド
awk 'BEGIN{OFS=""} {print $1, $2}' input.txt
実行結果
A1
B2
C3
仕組み
| 要素 | 内容 |
|---|---|
| OFS | 出力フィールド区切り文字(Output Field Separator) |
| OFS="" | 区切り文字を空に設定 |
| print $1, $2 | フィールド間は本来OFSで結合される |
| 結果 | 区切りが無くなりフィールドが連結される |
解説
OFSを空文字にすることで、フィールド間の区切りが消え連結されます。awkの出力制御の基本テクニックです。
CSV形式のデータ変換フロー
ファイル作成
cat << 'EOF' > input.txt
name age city
Alice 25 Tokyo
Bob 30 Osaka
EOF
実行コマンド
awk 'BEGIN {OFS=","} {print $1, $2, $3}' input.txt
実行結果
name,age,city
Alice,25,Tokyo
Bob,30,Osaka
実行コマンド
awk 'BEGIN {OFS=","} NR>1 {print $1, $2, $3}' input.txt
実行結果
Alice,25,Tokyo
Bob,30,Osaka
仕組み
| 項目 | 内容 |
|---|---|
| awk | テキスト処理ツール |
| OFS | 出力フィールド区切り文字(Output Field Separator) |
| BEGIN | 処理前に一度だけ実行 |
| NR | 行番号(Number of Records) |
| フィールドをOFSで連結して出力 |
解説
awkのOFSを使うことで、スペース区切りのデータを簡単にCSVへ変換できます。
BEGINでOFSを指定するのがポイントです。
awkのOFSを使いこなすための実践的まとめ
awkとofsの関係を正しく理解すれば、単なるテキスト処理ツールから一歩進んだデータ整形ツールとして活用できます。
最初は挙動の違いに戸惑うかもしれませんが、今回紹介したポイントを押さえれば、安定して意図通りの出力を得られるようになります。

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