はじめに
テキスト処理を効率よく行いたいときに活躍するのがawkです。
特にログ解析やCSV処理など、区切り文字で分割されたデータを扱う場面では非常に強力なツールです。その中でも重要な概念がfsです。
これはフィールドセパレータと呼ばれ、入力データをどのように分割するかを決定する役割を持ちます。
awkにおけるフィールドセパレータの仕組みを理解すると、単純なテキスト処理から一歩進んで、複雑なデータ整形や抽出が可能になります。
しかし、初学者がつまずきやすいポイントでもあります。例えば、デフォルトの挙動と明示的な指定の違い、正規表現を使った柔軟な分割などは、理解が曖昧なままだと意図しない結果を招きがちです。
この記事では、awkにおけるフィールドセパレータの基本から応用までを一つの流れとして解説します。
各見出しに沿って読み進めることで、fsの役割と実践的な使い方が自然と身につく構成になっています。
参考:GNU awk
AWKにおけるフィールドセパレータ(FS)の役割と仕組み
ファイル作成
cat << 'EOF' > input.txt
apple,100,red
banana,200,yellow
grape,300,purple
EOF
実行コマンド
awk -F',' '{print $1, $2, $3}' input.txt
実行結果
apple 100 red
banana 200 yellow
grape 300 purple
実行コマンド
awk -F',' '{print $2}' input.txt
実行結果
100
200
300
仕組み
| 項目 | 内容 |
|---|---|
| FS(フィールドセパレータ) | 入力行を分割する区切り文字 |
| デフォルトFS | スペースやタブ |
| -F',' | カンマ区切りとして分割 |
| $1, $2, $3 | 分割された各フィールドにアクセス |
| 処理の流れ | 1行読み込み → FSで分割 → フィールド変数に格納 |
解説
FSは行データを分割する基準で、CSVのような形式を扱う際に必須の設定です。
適切に指定することで、awkで柔軟にデータ抽出ができます。
デフォルトの区切り文字とスペース・タブの挙動の違い
ファイル作成
cat << 'EOF' > input.txt
a b c
a b c
a b c
EOF
※タブはCtrl+vを押した後にタブキーを押してください
実行コマンド
awk '{print $1 "|" $2 "|" $3}' input.txt
実行結果
a|b|c
a|b|c
a|b|c
実行コマンド
awk 'BEGIN{FS=" "}{print $1 "|" $2 "|" $3}' input.txt
実行結果
a|b|c
a|b|c
a|b|c
実行コマンド
awk 'BEGIN{FS="\t"}{print $1 "|" $2 "|" $3}' input.txt
実行結果
a b c||
a|b|c
a b|c|
仕組み
| 設定 | 区切り文字の扱い | スペース | タブ | 連続区切り |
|---|---|---|---|---|
| デフォルト(FS未指定) | 空白類をまとめて1区切り | ○ | ○ | まとめる |
| FS=" " | 特別扱い(デフォルトと同等) | ○ | ○ | まとめる |
| FS="\t" | タブのみ区切り | × | ○ | 個別に扱う |
解説
awk の FS=" " は特別で、スペース・タブ・連続空白をまとめて1区切りとして扱う点がミソ。
一方で FS="\t" のように明示すると、その文字だけが厳密に区切りになる。
コマンドライン引数「-F」を使った区切り文字の指定方法
ファイル作成
cat << 'EOF' > input.txt
name:age:city
Alice:25:Tokyo
Bob:30:Osaka
Charlie:35:Nagoya
EOF
実行コマンド
awk -F ':' '{print $1, $3}' input.txt
実行結果
Alice Tokyo
Bob Osaka
Charlie Nagoya
実行コマンド
awk 'BEGIN {FS=":"} {print $2}' input.txt
実行結果
age
25
30
35
仕組み
| 項目 | 内容 |
|---|---|
| -F オプション | フィールド区切り文字(FS)を指定 |
| FS | awk内部で使用される区切り変数 |
| $1, $2... | 区切られた各フィールド |
| デフォルトFS | 空白(スペース・タブ) |
解説
-Fを使うとコマンドラインから簡単に区切り文字を変更できます。
FSは内部変数なので、BEGIN句でも同様に設定可能です。
BEGINブロック内で変数「FS」を定義するメリットと書き方
ファイル作成
cat << 'EOF' > input.txt
apple,100
banana,200
orange,300
EOF
実行コマンド
awk 'BEGIN { FS="," } { print $1, $2 }' input.txt
実行結果
apple 100
banana 200
orange 300
実行コマンド
awk -F "," '{ print $1, $2 }' input.txt
実行結果
apple 100
banana 200
orange 300
仕組み
| 項目 | 内容 |
|---|---|
| FS | フィールド区切り文字を指定する変数 |
| BEGINブロック | 入力処理前に一度だけ実行される |
| BEGINでFS定義 | 全レコードに対して一貫した区切り設定が可能 |
| -Fオプション | コマンドラインからFSを指定する簡易方法 |
| $1, $2 | 区切られた各フィールドへのアクセス |
解説
BEGIN内でFSを定義すると、スクリプト内部で設定を完結できて可読性が上がります。
外部オプションに依存しないため再利用性も高くなります。
正規表現をFSに指定して複雑なパターンのデータを分割
ファイル作成
cat << 'EOF' > input.txt
id:1001|name=Alice,age=25
id:1002|name=Bob,age=30
id:1003|name=Charlie,age=22
EOF
実行コマンド
awk -F '[:|=,]' '{print $2, $4, $6}' input.txt
実行結果
1001 Alice 25
1002 Bob 30
1003 Charlie 22
仕組み
| 要素 | 内容 |
|---|---|
| -F '[:|=,]' | いずれかの記号で分割 |
| $2 | idの値(1001など) |
| $4 | nameの値(Aliceなど) |
| $6 | ageの値(25など) |
| awkの動作 | 指定した正規表現で1行を分割し、フィールドとして扱う |
解説
awkでは-Fに正規表現を指定することで複数の区切り文字を同時に扱えます。
これにより、複雑なフォーマットのデータもシンプルに分割・抽出できます。
カンマ区切り(CSV)のファイルを正確に処理する設定
ファイル作成
cat << 'EOF' > input.txt
name,age,city
Alice,30,Tokyo
Bob,25,Osaka
Charlie,35,Nagoya
EOF
実行コマンド
awk -F',' '{print $1, $2, $3}' input.txt
実行結果
name age city
Alice 30 Tokyo
Bob 25 Osaka
Charlie 35 Nagoya
実行コマンド
awk -F',' '{print $1}' input.txt
実行結果
name
Alice
Bob
Charlie
実行コマンド
awk 'BEGIN{FS=","} {print $2}' input.txt
実行結果
age
30
25
35
仕組み
| 要素 | 内容 |
|---|---|
| -F',' | フィールド区切り文字(FS)をカンマに指定 |
| FS="," | BEGIN句で区切り文字を設定 |
| $1,$2,$3 | 1列目、2列目、3列目を取得 |
| $0 | 行全体 |
| awk | テキストを列単位で処理するコマンド |
解説
awkはFSで区切り文字を指定することでCSVを正確に分割できます。
カンマ区切りの場合は-F','またはFS=","を使うのが基本です。
複数文字を区切り文字として一括指定する方法
ファイル作成
cat << 'EOF' > input.txt
apple,orange;banana|grape
dog;cat,bird|fish
EOF
実行コマンド
awk -F '[,;|]' '{print $1, $2, $3, $4}' input.txt
実行結果
apple orange banana grape
dog cat bird fish
仕組み
| 要素 | 内容 |
|---|---|
| -F | フィールド区切り文字(FS)を指定 |
| [,;|] | カンマ・セミコロン・パイプを区切りとして扱う |
| $1,$2... | 区切られた各フィールドを参照 |
| awk | 行ごとに分割・処理を実行 |
解説
awkのFSには正規表現が使えるため、複数の区切り文字をまとめて指定可能。
文字クラス [] を使うのがシンプルで実用的。
出力時の区切り文字を制御する変数「OFS」との連携活用
ファイル作成
cat << 'EOF' > input.txt
apple orange banana
cat dog mouse
red blue green
EOF
実行コマンド
awk 'BEGIN {FS=" "; OFS=","} {print $1, $2, $3}' input.txt
実行結果
apple,orange,banana
cat,dog,mouse
red,blue,green
実行コマンド
awk 'BEGIN {FS=" "; OFS=" | "} {print $1, $3}' input.txt
実行結果
apple | banana
cat | mouse
red | green
仕組み
| 要素 | 役割 | 説明 |
|---|---|---|
| FS (Field Separator) | 入力区切り | 入力データを分割する区切り文字(例: 空白) |
| OFS (Output Field Separator) | 出力区切り | print時にフィールド間へ挿入される区切り文字 |
| $1, $2, $3 | フィールド参照 | 分割された各列データ |
| 出力処理 | OFSを使ってフィールドを結合して出力 |
解説
FSで入力を分割し、OFSで出力フォーマットを自由に制御できるため、データ整形に非常に有効です。特にCSV風変換やログ加工でよく使われます。
処理の途中でFSを動的に変更して多段構造のテキストを解析
ファイル作成
cat << 'EOF' > input.txt
A:1,2,3
B:4,5,6
C:7,8,9
EOF
実行コマンド
awk -F':' '{
key=$1
FS=","
split($2, arr, ",")
for(i=1;i<=length(arr);i++){
print key, arr[i]
}
FS=":"
}' input.txt
実行結果
A 1
A 2
A 3
B 4
B 5
B 6
C 7
C 8
C 9
仕組み
| ステップ | 内容 | FSの状態 | 説明 |
|---|---|---|---|
| ① | 行読み込み | : | 最初に「:」でキーと値を分割 |
| ② | key取得 | : | $1 に A/B/C を格納 |
| ③ | FS変更 | , | フィールド区切りをカンマに変更 |
| ④ | split実行 | , | $2 を配列に分割 |
| ⑤ | ループ出力 | , | 多段構造を展開して出力 |
解説
awkでは処理途中でFSを変更しつつ split を使うことで、階層的なデータを柔軟に分解できます。
これにより1行内の複数レベル構造もシンプルに扱えます。
空文字をFSに指定して1文字ずつ分解・処理するテクニック
ファイル作成
cat << 'EOF' > input.txt
hello
EOF
実行コマンド
awk 'BEGIN{FS=""} {for(i=1;i<=NF;i++) print $i}' input.txt
実行結果
h
e
l
l
o
仕組み
| 要素 | 内容 |
|---|---|
| FS="" | フィールド区切りを空文字に設定 |
| NF | 分割されたフィールド数(=文字数) |
| $i | i番目の1文字 |
| for文 | 1文字ずつループ処理 |
解説
FSを空文字にすると、awkは1文字ごとにフィールド分割します。
これにより文字単位の処理がシンプルに書けます。
awkとfsを使いこなすための実践ポイントまとめ
awkにおけるfsは単なる区切り指定ではなく、テキスト処理全体の精度と柔軟性を左右する重要な要素です。
デフォルトの挙動を理解した上で、-FやBEGINでの設定、さらには正規表現の活用まで段階的に習得することが大切です。
特に初学者の段階では、スペース区切りの挙動やCSV処理での落とし穴に注意する必要があります。
一見うまく動いているように見えても、データによっては誤動作することがあります。
awkとfsの理解が深まるほど、テキスト処理の自由度は大きく広がります。
まずは基本を確実に押さえ、少しずつ応用に挑戦していくことが上達への近道です。

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