CSV処理は awk を使わずに「IFS」 を利用する

ShellのIFS(区切り文字)について

シェルスクリプトで CSV や区切り文字のデータを扱うとき、awkを利用していましたが最近はAIを利用してシェルスクリプトを作成する機会が増えました。
その際にAIは、「IFS」を利用するケースがあります。これまでawkで対応していたので、「IFS」の利用方法をまとめます

awk を使った CSV 処理(従来のやり方)

awkを利用して1行づつ処理する場合は、以下のようなコードになります

# 処理するデータ
2025-01-01,090-1234-5678,OK

# 1行づつ読み込んで、「,」区切りで取得
while read line
do
    DATE=$(echo "$line" | awk -F, '{print $1}')
    TEL=$(echo "$line" | awk -F, '{print $2}')
    STATUS=$(echo "$line" | awk -F, '{print $3}')
done < data.csv

【問題点】
ファイルの容量が小さい場合は良いですが、大量のログや大容量のCSVファイルだと処理が遅いし無駄が多いです

  • 毎回 awk プロセスが起動される
  • 同じ行を何度もパイプで流している
  • 正直、少し冗長

IFS を使った CSV 処理

IFS(Internal Field Separator)はシェルが文字列を分割する際の区切り文字 です。通常は「空白・タブ・改行」が設定されています。また区切り文字の指定もできます

# 処理するデータ
2025-01-01,090-1234-5678,OK

# IFSを利用すると以下のようなになります
while IFS=, read DATE TEL STATUS
do
    echo "DATE=$DATE"
    echo "TEL=$TEL"
    echo "STATUS=$STATUS"
done < data.csv

【特徴】
一見してわかるようにawk不要で、スッキリして見やすいです

  • awk 不要
  • 外部コマンドなし
  • read だけで変数に代入できる

区切り文字について

IFSでread コマンドで使用する 区切り文字 を指定できます。

カンマ区切り

while IFS=, read col1 col2 col3
do
    echo "$col1 $col2 $col3"
done < data.csv

コロン区切り(例:/etc/passwd)

IFS=: read user pass uid gid comment home shell <<< "$line"

タブ区切り

IFS=$'\t' read col1 col2 col3

\ 最新情報をチェック /