Tengo un archivo que contiene la única línea a continuación:
{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}
en el que tengo dos conjuntos de datos:
machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
Ahora, necesito leer el archivo anterior y dividirlo de tal manera que pueda extraer la información de cada máquina como se mencionó anteriormente y almacenarla en alguna estructura de datos.
Actualmente, estoy confundido sobre qué estructura de datos debería usar en un script de shell bash. Si estuviera haciendo esto en Java, lo usaría Map<String, Set<String>>
pero no estoy seguro de qué debo usar en un script de shell.
Y después de almacenarlo en alguna estructura de datos, necesito iterarlo e imprimir el resultado.
Puedo leer el archivo anterior usando el script de shell a continuación:
#!/bin/bash
while read -r line; do
echo "$line"
done < data.txt
Pero no estoy seguro de cómo dividir los datos de la línea anterior de tal manera que pueda extraer la información de cada máquina y luego almacenarla en alguna estructura de datos.
ACTUALIZAR:-
A continuación se muestra mi script de shell que tengo después de seguir la sugerencia 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
eval
, allí.Las utilidades de procesamiento de texto de shell están diseñadas principalmente para manipular datos representados con un registro por línea y campos separados por espacios en blanco o un carácter fijo. Este formato es completamente diferente y no podrá procesarlo de manera directa.
Un enfoque es preprocesar el archivo para que se ajuste al tipo de formato que se puede procesar fácilmente. Supongo que los corchetes y los corchetes no se usan de ninguna otra manera que no se muestra aquí (corchetes alrededor del texto completo, corchetes alrededor de las listas de valores de la máquina).
El resultado tiene una máquina por línea y comas para separar los registros. El siguiente fragmento analiza el nombre de la máquina en cada línea y deja una lista de valores separados por comas
values
.El siguiente fragmento específico de bash coloca los valores en una matriz.
fuente
Puedes usar
awk
para completar la tarea.fuente
Esto se parece un poco a JSON. Puede arreglarlo para que sea JSON adecuado y usar herramientas JSON:
fuente