У меня есть файл, который содержит одну строку ниже:
{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}
в котором у меня есть два набора данных:
machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
Теперь мне нужно прочитать вышеуказанный файл и разбить его таким образом, чтобы я мог извлечь информацию о каждой машине, как указано выше, и сохранить ее в некоторой структуре данных.
В настоящее время я не понимаю, какую структуру данных мне следует использовать в сценарии оболочки bash. Если бы я делал это на Java, я бы использовал, Map<String, Set<String>>
но я не уверен, что я должен использовать в сценарии оболочки.
И после сохранения в некоторой структуре данных, мне нужно повторить и распечатать результат.
Я могу прочитать вышеуказанный файл, используя скрипт ниже:
#!/bin/bash
while read -r line; do
echo "$line"
done < data.txt
Но я не уверен, как разделить вышеуказанные строчные данные таким образом, чтобы я мог извлечь информацию о каждой машине и затем сохранить ее в некоторой структуре данных?
ОБНОВИТЬ:-
Ниже приведен мой сценарий оболочки, который я получил после того, как следовал предложению 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
, там.Утилиты обработки текста оболочки в первую очередь предназначены для манипулирования данными, представленными одной записью на строку и полями, разделенными пробелами или фиксированным символом. Этот формат совершенно другой, и вы не сможете обработать его простым способом.
Один из подходов заключается в предварительной обработке файла для соответствия типу формата, который может быть легко обработан. Я предполагаю, что скобки и фигурные скобки не используются ни в каком другом виде, кроме как здесь изображены (фигурные скобки вокруг всего текста, квадратные скобки вокруг списков машинных значений).
Результат имеет один компьютер на строку и запятые для разделения записей. Следующий фрагмент разбирает имя машины в каждой строке и оставляет список значений через запятую
values
.Следующий специфичный для bash фрагмент кода помещает значения в массив.
источник
Вы можете использовать
awk
для выполнения задачи.источник
Это немного похоже на JSON. Вы можете исправить это, чтобы быть правильным JSON и использовать инструменты JSON:
источник