Wie wäre es mit einem einfachen Bourne-Shell-Skript (meistens):
tr -d ':,' file.txt | while read p r; do for i in $r; do echo "$p.$i"; done; done
Der Befehl "tr" bereinigt nur die Doppelpunkte (:) und Kommas (,) - diese Antwort hängt davon ab, dass die Daten Leerzeichen enthalten (die in den Beispieldaten enthalten sind). Andernfalls müssen Sie sed verwenden, um: und stattdessen in Leerzeichen zu konvertieren von tr).
Die Ausgabe von "tr" wird in die äußere Schleife "beim Lesen ...; do ...; done" geleitet, die beim ersten Auftreten von Leerzeichen (oder besser gesagt beim Inhalt von "$ IFS" Zeilen liest und in zwei Teile zerlegt "- das Shell-Eingabefeldtrennzeichen (standardmäßig Leerzeichen), wobei das Präfix in" $ p "und der Rest der Zeile in" $ r "belassen wird.
Die innere Schleife "for i in ...; do ...; done" bricht dann den Inhalt von "$ r" im Leerzeichen ("$ IFS") auf und setzt jedes Element in "$ i", bevor der Echo-Befehl ausgeführt wird .
BEARBEITEN: siehe Kommentare - Sie brauchen überhaupt kein "tr" ... die Doppelpunkte und Kommas können bereinigt werden, indem Sie sie wie folgt in die IFS-Variable aufnehmen:
OIFS="$IFS"; IFS=":, "; while read p r; do
for i in $r; do echo "$p.$i"; done; done <file.txt; IFS="$OIFS"
alles innerhalb der Shell erledigt - keine Aufrufe externer Programme ... (es sei denn, Echo ist nicht eingebaut). Beachten Sie, dass IFS = oben ein Leerzeichen und ein Tabulatorzeichen enthält. Beachten Sie auch, dass das $ r in der zweiten for-Schleife keine Anführungszeichen enthält - dies ist absichtlich so, dass die Shell es in Leerzeichen aufteilt.