シェルスクリプトで区切り文字を設定する

概要

bashcsvファイルを読み込むときに

while read line;
do
    key=`echo $line | cut -d ',' -f 1`
    val=`echo $line | cut -d ',' -f 2`
    echo "${key} ${val}"
done < test.csv

と書いたところ指摘された。
指摘された理由としては
「1行ずつcutコマンドが処理されるため、
 ファイルサイズが大きくなるにつれて処理時間も大きくなる」
ということだった。

結論

書き方としては下記の通り。

OLDIFS=$IFS
IFS=,

while read key val ;
do
    echo "${key} ${val}"
done < test.csv
IFS=$OLDIFS

大きな点としては環境変数IFSを使用している。

IFSについて

IFS は Internal Filed Separator の略らしく区切り文字を設定する。
デフォルトでは空白らしくスペース、改行、タブが含まれる。
処理の流れとしてはOLDIFSでデフォルトのIFSの状態を格納して、
ファイル処理の終了後に元のIFSの設定に戻している。

参考

qiita.com

www.server-memo.net