以下は、csv ファイルを取り込み、希望どおりにフォーマットされた行を吐き出すための bash シェル スクリプトです (他にも変更がいくつかありますが、以下に示すものに影響を与える配列のみを保持しています)。
FILENAME=$1
cat $FILENAME | while read LINE
do
OIFS=$IFS;
IFS=","
columns=( $LINE )
date=${columns[4]//\"/}
columns[13]=${columns[13]//\"/}
columns[4]=$(date -d $date +%s)
newline=${columns[*]}
echo $newline
IFS=$OIFS;
done
CentOS 6.3 用の GNU bash v 4.1.2(1) リリースを使用しています。私は次のような引用符を入れてみました
newline="${columns[*]}"
まだ運がありません。
以下はサンプルデータ行です
112110120001299169,112110119001295978,11,"121.119.163.146.1322221980963094","2012/11/01"
配列をコンマ区切りの文字列に出力する必要があるようです。代わりに、文字列はスペースで区切られています。その理由を知っている人はいますか?
スクリプトで $IFS をエコーアウトすると空の文字列になるという事実と関係があると思われますが、「${IFS}」をエコーアウトすると、期待するカンマになります。
編集:解決策
解決策を見つけました。$newline をエコーアウトするときは、引用符で囲む必要があります。
echo "$newline"
それ以外の場合は、デフォルトの空白が使用されます。引用符を付けて強制的にIFSにサブインするだけのbashと関係があると思います。