csvファイル($ file)列に別の配列を書き込もうとしています。
各配列には同じ数の値があります。たとえば、arr1とarr2にはそれぞれ3つの値があります。
arr1=( 23 45 34 )
arr2=( "abc,d" ef g )
次のコードを試しましたが、間違った結果が出ました。
for i in "${!arr1[@]}"; do
echo "${arr1[i]}, ${arr2[i]}" >> $file
done
col1、col2、および col3 が 3 つの列で、次の結果が得られます。
col1 col2 col3
23 "abc d"
45 ef
34 g
しかし、望む結果は
col1 col2
23 "abc,d"
45 ef
34 g
「abc、d」に含まれる昏睡状態が問題の原因のようです。この問題に対する解決策を知っている人、またはより良い方法を持っている人はいますか?
よろしくお願いします!
ベストアンサー1
ファイルの表示方法(おそらくスプレッドシートプログラムを使用しますか?)はあなたの質問からは明確ではありませんが、シェルは配列定義から引用符を削除できます。埋め込まれたコンマをCSV準拠の方法で処理するには、次のものを追加する必要があります。たとえば、リテラル引用として使用されます。
arr1=( 23 45 34 )
arr2=( \"abc,d\" ef g )
したがって、シェルの内部表現は次のようになります。
$ declare -p arr1 arr2
declare -a arr1=([0]="23" [1]="45" [2]="34")
declare -a arr2=([0]="\"abc,d\"" [1]="ef" [2]="g")
例えば
for i in "${!arr1[@]}"; do
printf '%s,%s\n' "${arr1[i]}" "${arr2[i]}"
done > "$file"
明らかにする
$ cat "$file"
23,"abc,d"
45,ef
34,g
別のオプションは、すべてのフィールドを引用することです。
arr1=( 23 45 34 )
arr2=( "abc,d" ef g )
for i in "${!arr1[@]}"; do
printf '"%s","%s"\n' "${arr1[i]}" "${arr2[i]}"
done > "$file"
与える
$ cat "$file"
"23","abc,d"
"45","ef"
"34","g"