awk でフィールド区切りが効かないときの対処

  • URLをコピーしました!

aw はテキスト処理に強力なツールで、ログ解析や CSV 処理など幅広く使われています。
しかし、実際に使うときに

awk '{print $2}'

のように指定しても 思った通りにフィールド区切りが効かない ことがあります。

本記事では、awk でフィールド区切りが効かない原因と、その解決方法を解説します。

目次

1. デフォルトの区切りは「空白(スペース or タブ)」

原因

awk は標準では「空白類(スペースやタブの連続)」を区切り文字として扱います。
そのため、CSV ファイルのように カンマ区切り のデータを処理すると、意図通りに分割されません。

確認例

echo "name,age,city" | awk '{print $2}'

→ 何も表示されない。

解決方法

-F オプションでフィールド区切りを明示します。

echo "name,age,city" | awk -F',' '{print $2}'
# 出力: age

2. 区切り文字の指定ミス

原因

  • 区切り文字をクォートで囲んでいない
  • シェルに解釈される記号をそのまま使っている

例:awk -F| と書くと、シェルが | をパイプとして扱ってしまう。

解決方法

区切り文字は必ず シングルクォート で囲みます。

awk -F'|' '{print $1}'

もしタブ区切りなら以下のように書きます。

awk -F't' '{print $1}'

3. 入力データに全角スペースや不可視文字が含まれている

原因

ログファイルや外部から取得した CSV には、全角スペース制御文字 が混じっていることがあります。
見た目は同じでも awk が正しく区切れないため、フィールド数がずれます。

確認方法

cat -Aod -c で隠し文字を確認します。

cat -A file.txt | head -n 3

解決方法

trsed で不要な文字を削除してから処理します。

cat file.txt | tr -d 'r' | awk -F',' '{print $2}'

4. ファイルの改行コード問題(LF/CRLF)

原因

Windows 由来のファイルは CRLF(rn) 改行になっており、awk で想定通りにフィールド分割できないことがあります。

確認方法

file data.csv

CRLF と表示されたら Windows 形式です。

解決方法

UNIX 形式に変換してから awk で処理します。

dos2unix data.csv

あるいは tr コマンドで変換:

cat data.csv | tr -d 'r' | awk -F',' '{print $2}'

5. まとめ

awk でフィールド区切りが効かないときは以下をチェックしましょう。

  1. デフォルトはスペース/タブ区切り → -F で明示
  2. 区切り文字の指定ミス → クォートで囲む
  3. 全角スペースや不可視文字 → cat -A で確認、tr で除去
  4. 改行コードの違い → dos2unix で変換

正しく区切りを設定すれば、awk はログ処理や CSV 分析にとても便利に使えます。

目次