Eu tenho um arquivo que contém a única linha abaixo:
{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}
em que tenho dois conjuntos de dados:
machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
Agora, preciso ler o arquivo acima e dividi-lo de forma que possa extrair as informações de cada máquina conforme mencionado acima e armazená-las em alguma estrutura de dados.
Atualmente, estou confuso sobre qual estrutura de dados devo usar em um script de shell bash. Se eu estivesse fazendo isso em Java, usaria, Map<String, Set<String>>
mas não tenho certeza do que devo usar em um shell script.
E depois de armazená-lo em alguma estrutura de dados, preciso iterá-lo e imprimir o resultado.
Consigo ler o arquivo acima usando o script de shell abaixo:
#!/bin/bash
while read -r line; do
echo "$line"
done < data.txt
Mas não sei como dividir os dados da linha acima de maneira a poder extrair as informações de cada máquina e armazená-las em alguma estrutura de dados?
ATUALIZAR:-
Abaixo está o meu script de shell que recebi depois de seguir a sugestão dada por glenn -
#!/bin/bash
while read -r line; do
echo "$line"
declare -A "$(
echo "x=("
grep -oP '(\w+)(?==)|(?<==\[).*?(?=\])' <<< "$line" |
tr -d , |
paste - - |
sed 's/^/[/; s/\t/]="/; s/$/"/'
echo ")"
)"
for key in "${!x[@]}"; do # need quotes here
for element in ${x[$key]}; do # no quotes here
printf "%s\t%s\n" "$key" "$element"
done
done
done < primary.txt
fonte
eval
, lá.Os utilitários de processamento de texto do shell são projetados principalmente para manipular dados representados com um registro por linha e campos separados por espaço em branco ou por um caractere fixo. Esse formato é completamente diferente e você não poderá processá-lo de maneira direta.
Uma abordagem é pré-processar o arquivo para se ajustar ao tipo de formato que pode ser processado facilmente. Suponho que colchetes e chaves não sejam usados de maneira alguma que não sejam os retratados aqui (chaves em todo o texto, colchetes em torno das listas de valores da máquina).
O resultado possui uma máquina por linha e vírgulas para separar os registros. O seguinte trecho analisa o nome da máquina em cada linha e deixa uma lista de valores separados por vírgula
values
.O seguinte snippet específico do bash coloca os valores em uma matriz.
fonte
Você pode usar
awk
para concluir a tarefa.fonte
Parece um pouco com JSON. Você pode corrigi-lo como JSON adequado e usar as ferramentas JSON:
fonte