다음 내용이 포함된 파일이 있습니다.
목록:
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]
물론 이 문제를 해결하는 방법은 여러 가지가 있습니다. 다음은 한 가지 방법입니다(귀하의 방법에 가깝습니다).
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
어려운 작업을 수행하는 더 좋은 방법이 있을 수 있습니다.