Ich habe eine Datei, die die folgende einzelne Zeile enthält:
{machineA=[0, 1024, 4, 1028], machineB=[1, 1025, 5, 1029]}
in dem ich zwei Datensätze habe:
machineA=[0, 1024, 4, 1028]
machineB=[1, 1025, 5, 1029]
Jetzt muss ich die obige Datei lesen und so aufteilen, dass ich die Informationen der einzelnen Maschinen wie oben erwähnt extrahieren und in einer Datenstruktur speichern kann.
Derzeit bin ich verwirrt, welche Datenstruktur ich in einem Bash-Shell-Skript verwenden soll. Wenn ich dies in Java tun würde, würde ich verwenden, Map<String, Set<String>>
aber ich bin nicht sicher, was ich in einem Shell-Skript verwenden soll.
Und nachdem ich es in einer Datenstruktur gespeichert habe, muss ich es iterieren und das Ergebnis ausdrucken.
Ich kann die obige Datei mit dem folgenden Shell-Skript lesen:
#!/bin/bash
while read -r line; do
echo "$line"
done < data.txt
Ich bin mir jedoch nicht sicher, wie ich die obigen Zeilendaten so aufteilen soll, dass ich jede Maschineninformation extrahieren und dann in einer Datenstruktur speichern kann.
AKTUALISIEREN:-
Unten ist mein Shell-Skript, das ich erhalten habe, nachdem ich dem Vorschlag von glenn gefolgt bin -
#!/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
, da.Die Shell-Textverarbeitungsprogramme dienen in erster Linie dazu, Daten zu bearbeiten, die mit einem Datensatz pro Zeile und Feldern dargestellt werden, die entweder durch Leerzeichen oder ein festes Zeichen getrennt sind. Dieses Format ist völlig anders und Sie können es nicht einfach verarbeiten.
Ein Ansatz besteht darin, die Datei so vorzuverarbeiten, dass sie dem Format entspricht, das leicht verarbeitet werden kann. Ich gehe davon aus, dass Klammern und Klammern nicht anders als hier dargestellt verwendet werden (Klammern um den gesamten Text, Klammern um Maschinenwertelisten).
Das Ergebnis enthält eine Maschine pro Zeile und Kommas zum Trennen von Datensätzen. Das folgende Snippet analysiert den Computernamen in jeder Zeile und hinterlässt eine durch Kommas getrennte Liste von Werten in
values
.Das folgende Bash-spezifische Snippet fügt die Werte in ein Array ein.
quelle
Sie können verwenden
awk
, um die Aufgabe abzuschließen.quelle
Das sieht ein bisschen wie JSON aus. Sie können das Problem mit JSON beheben und JSON-Tools verwenden:
quelle