クリップボードにコピーしました!
文字列のawk

awkとOFSの仕組みを理解して自在に区切り文字を操る方法

updated: 2026/05/05 created: 2026/05/04

はじめに

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...フィールド単位でデータを取得
printフィールド間に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

仕組み

項目内容
OFSOutput 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

仕組み

項目内容
OFSOutput 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各フィールド(空白区切り)
printフィールドを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 が適用される)
print再構築された $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各列(フィールド)を指定
print指定フィールドを出力
動的区切り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)
printフィールドをOFSで連結して出力

解説

awkのOFSを使うことで、スペース区切りのデータを簡単にCSVへ変換できます。
BEGINでOFSを指定するのがポイントです。

awkのOFSを使いこなすための実践的まとめ

awkとofsの関係を正しく理解すれば、単なるテキスト処理ツールから一歩進んだデータ整形ツールとして活用できます。

最初は挙動の違いに戸惑うかもしれませんが、今回紹介したポイントを押さえれば、安定して意図通りの出力を得られるようになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

©︎ 2025-2026 running terminal commands