Mam plik zawierający jedną linię poniżej:
{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}
w którym mam dwa zestawy danych:
machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
Teraz muszę przeczytać powyższy plik i podzielić go w taki sposób, aby wyodrębnić informacje o każdym komputerze, jak wspomniano powyżej, i zapisać je w jakiejś strukturze danych.
Obecnie nie jestem pewien, jakiej struktury danych powinienem używać w skrypcie powłoki bash. Gdybym robił to w Javie, skorzystałbym, Map<String, Set<String>>
ale nie jestem pewien, czego powinienem użyć w skrypcie powłoki.
Po zapisaniu go w jakiejś strukturze danych muszę go powtórzyć i wydrukować wynik.
Jestem w stanie odczytać powyższy plik za pomocą poniższego skryptu powłoki:
#!/bin/bash
while read -r line; do
echo "$line"
done < data.txt
Ale nie jestem pewien, jak podzielić powyższe dane wiersza w taki sposób, aby móc wyodrębnić informacje o każdej maszynie, a następnie zapisać je w jakiejś strukturze danych?
AKTUALIZACJA:-
Poniżej znajduje się mój skrypt powłoki, który otrzymałem po wykonaniu sugestii 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
, tam.Narzędzia do przetwarzania tekstu powłoki są zaprojektowane przede wszystkim do manipulowania danymi reprezentowanymi przez jeden rekord na linię i pola oddzielone białymi znakami lub stałym znakiem. Ten format jest zupełnie inny i nie będzie można go przetworzyć w prosty sposób.
Jednym z podejść jest wstępne przetworzenie pliku w celu dopasowania do formatu, który można łatwo przetworzyć. Zakładam, że nawiasy klamrowe i nawiasy klamrowe nie są używane w żaden inny sposób niż tutaj przedstawiony (nawiasy klamrowe wokół całego tekstu, nawiasy klamrowe wokół list wartości maszynowych).
Wynik ma jedną maszynę na linię i przecinki do oddzielania rekordów. Poniższy fragment kodu analizuje nazwę komputera w każdym wierszu i pozostawia listę wartości oddzielonych przecinkami
values
.Poniższy fragment kodu bash umieszcza wartości w tablicy.
źródło
Możesz użyć
awk
do wykonania zadania.źródło
To wygląda trochę jak JSON. Możesz to naprawić, aby był prawidłowy JSON i używać narzędzi JSON:
źródło