BASHを使用して配列からCSVファイルにコンマを含む値を書き込む

BASHを使用して配列からCSVファイルにコンマを含む値を書き込む

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"

おすすめ記事