次の内容を含むファイルがあります。
リスト:
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
難しい作業を行うより良い方法があるかもしれません。