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

awkで理解するfsの基本と応用テクニック入門

updated: 2026/05/05 created: 2026/05/03

はじめに

テキスト処理を効率よく行いたいときに活躍するのが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)を指定
FSawk内部で使用される区切り変数
$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 '[:|=,]'いずれかの記号で分割
$2idの値(1001など)
$4nameの値(Aliceなど)
$6ageの値(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,$31列目、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フィールド参照分割された各列データ
print出力処理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分割されたフィールド数(=文字数)
$ii番目の1文字
for文1文字ずつループ処理

解説

FSを空文字にすると、awkは1文字ごとにフィールド分割します。
これにより文字単位の処理がシンプルに書けます。

awkとfsを使いこなすための実践ポイントまとめ

awkにおけるfsは単なる区切り指定ではなく、テキスト処理全体の精度と柔軟性を左右する重要な要素です。

デフォルトの挙動を理解した上で、-FやBEGINでの設定、さらには正規表現の活用まで段階的に習得することが大切です。

特に初学者の段階では、スペース区切りの挙動やCSV処理での落とし穴に注意する必要があります。

一見うまく動いているように見えても、データによっては誤動作することがあります。

awkとfsの理解が深まるほど、テキスト処理の自由度は大きく広がります。

まずは基本を確実に押さえ、少しずつ応用に挑戦していくことが上達への近道です。

コメントを残す

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

©︎ 2025-2026 running terminal commands