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

