ファイルを読み取り、スペースを削除して配列に保存する

ファイルを読み取り、スペースを削除して配列に保存する

次の内容を含むファイルがあります。

リスト:

blue,none
red,none
orange,plot
   baseball   ,     none
university,none
school,none
desk,plot
monitor,none
earphone,none

このファイルを読み、スペースを削除し、各列を別の配列に保存する必要があります。

スクリプト:

output_names=()
output_plots=()

while read line           
do
    item=$(echo -e "${line}" | tr -d '[[:space:]]')
    item=$(echo $item | tr "," "\n")
    output_names+=(${item[0]});
    output_plots+=(${item[1]});
done <list

echo "** output_names:";
for item in ${output_names[*]}
do
    echo $item
done

echo "** output_plots:";
for item in ${output_plots[*]}
do
    echo $item
done

しかし、期待どおりに動作しませんでした。何が問題なの?このコードを修正する方法は?

ノート

output['names'][*]誰かが別のキーと合計を使用して単一の配列にデータを保存するソリューションを持っている場合は、どうすればよいかわからoutput['plots'][*]ないので、本当に感謝します。

出力:

** output_names:
blue
none
red
none
orange
plot
baseball
none
university
none
school
none
desk
plot
monitor
none
earphone
none
** output_plots:

答え1

コードの問題は、順序とtr合計の(間違った)仮定です。item[0]item[1]

もちろん、この問題を解決する方法はいくつかあります。これは1つの方法です(あなたの方法に近いです)。

while IFS=, read left right
do
    output_names+=( "${left// }" )
    output_plots+=( "${right// }" )
done <list

(ループの変更のみを説明し、残りのコードはそのまま残しても構いません。)

答え2

これにより、スペースを含む文字列が返されます。

item=$(echo $item | tr "," "\n")

配列を取得するには、次のように変更します。

item=($(echo $item | tr "," "\n"))

出力:

** output_names:
blue
red
orange
baseball
university
school
desk
monitor
earphone
** output_plots:
none
none
plot
none
none
none
plot
none
none

難しい作業を行うより良い方法があるかもしれません。

関連情報