파일을 읽고 공백을 제거하고 배열에 저장

파일을 읽고 공백을 제거하고 배열에 저장

다음 내용이 포함된 파일이 있습니다.

목록:

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

어려운 작업을 수행하는 더 좋은 방법이 있을 수 있습니다.

관련 정보