Read file remove espaços e armazena em array

1

Eu tenho um arquivo com o seguinte conteúdo:

lista:

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

Eu preciso ler este arquivo, remover espaços e armazenar cada coluna em uma matriz diferente.

script:

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

No entanto, não funciona como eu esperava. O que está errado? e como corrigir esse código?

Nota

Se alguém tiver uma solução para armazenar os dados em uma única matriz com diferentes chaves output['names'][*] e output['plots'][*] , isso seria muito apreciado, pois não sei como fazê-lo.

Saídas:

** output_names:
blue
none
red
none
orange
plot
baseball
none
university
none
school
none
desk
plot
monitor
none
earphone
none
** output_plots:
    
por ar2015 25.03.2015 / 01:25

2 respostas

0

Isso retorna uma string com espaços:

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

altere assim para ter uma matriz:

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

saída:

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

Pode haver maneiras melhores de dificultar sua tarefa

    
por 25.03.2015 / 01:42
2

O problema com seu código é o comando tr e suas suposições (erradas) sobre item[0] e item[1] .

Existem, obviamente, várias maneiras de lidar com isso; aqui é um caminho (ficar perto de sua abordagem):

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

(Eu só mostrei as mudanças no loop, o resto do seu código pode ficar como está).

    
por 25.03.2015 / 01:48