シェルスクリプトでCSVファイルを読み込み、データを整形する機会があったため忘備録として記録に残そうと思います。
想定データ
カンマ区切りのデータを想定します。
1234,test1
5678,test2
9101,test3
スクリプトファイル
CSVファイルを一行ずつ読み込み、カンマ区切りでデータを分けて配列にしたのが以下のスクリプトです。
一致したデータを出力用のCSVファイルに追記する(>>)仕様になっています。
#!/bin/bash
# 読み込むファイル
FILE=test.csv
while read line || [ -n "${line}" ];
do
# tests[@]:全てのリスト表示
# tests[0]:1列目のデータ
# tests[1]:2列目のデータ
tests=(${line//,/ })
if [ "${tests[0]}" = "1234" ]; then
echo -e ${line} >> result1.csv
elif [ "${tests[0]}" = "5678" ]; then
echo -e ${line} >> result2.csv
elif [ "${tests[0]}" = "9101" ]; then
echo -e ${line} >> result3.csv
else
echo "一致しないエラー"
fi
done < ${FILE}
シェルスクリプトでSplitできる?
結論から言うと、他言語でいう区切り文字指定での分割処理はなさそうでした。
実現手段としてはいくつかあるようですが、今回は区切り文字を半角スペースに置換し、配列のデータとして取り込むことで分割を実現しています。
${line(対象文字列)//,(置換前文字列、カンマ)/ (置換後文字列、半角スペース)}
カンマ区切りを半角スペース区切りに変換
1234,test1 -> 1234 test1
その後、()
で囲み、配列に格納する。
1234 test1 -> (1234, test1)
上記をまとめると以下の形になります。
tests=(${line//,/ })
これでカンマ区切りの文字列を配列として操作できるようになります。
参考資料
告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。
みなさまからのご応募をお待ちしております。