Mit deinem Ansatz komme ich so weit:
Code: Alles auswählen
$ awk '/^--/ { f = 1 } !f { t = $NF; $NF = ""; a[t] = a[t] $0 } f { a[$0] = "" } END{ for (b in a) { print b FS a[b] }}' /tmp/data
[?] Henrikx liffi Luxuslurch nepos pschmae rendegast
[-] Absage
[*] cae catdog2 habakug niemand syssi
----
[-] hikaru inne uname
[?] Noch keine Rückmeldung
[*] Zusage
Im Prinzip merke ich mir den Typ der Zeile
t, loesche das letzte Feld (
NF -- number of fields) und erhalte damit den Namen inklusive irgendwelcher Whitespaces. Das Flag
f wird mit der Trennlinie eingeschaltet. Dummerweise ist die Reihenfolge bei
for (foo in bar) nicht vorhersagbar, daher sind die beiden Zeilen mit
[-] vertauscht.
Code: Alles auswählen
$ mawk '/^--/ { f = 1; } !f { split($NF, a, ""); $NF = ""; l[a[2]] = l[a[2]] $0; } f { l["zzz"NR] = $0 } END { for (b in l) print ((b !~ /^zzz/) ? "[" b "]" FS : "") l[b]; }' /tmp/data
[?] Henrikx liffi Luxuslurch nepos pschmae rendegast
----
[?] Noch keine Rückmeldung
[*] Zusage
[-] Absage
[*] cae catdog2 habakug niemand syssi
[-] hikaru inne uname
Nochmal ein Versuch, auf das
*?- zwischen den
[] zu matchen, ist aber auch nicht wirklich toll (und ausserdem in 'ne andere Richtung weiterentwickelt).
Meine Idee nicht wirklich schoen, aber wenn man den Teil ab
---- nicht ge
sort(1)et haben will und auf
stderr schreibt, erscheint er trotzdem vor dem
stdout aus
sort:
Code: Alles auswählen
$ awk '/^--/ { exit(0); } { print $2 FS $1; }' /tmp/data | LC_ALL=C sort; awk '/^--/ { f = 1; } f { print; }' /tmp/data
[*] cae
[*] catdog2
[*] habakug
[*] niemand
[*] syssi
[-] hikaru
[-] inne
[-] uname
[?] Henrikx
[?] Luxuslurch
[?] liffi
[?] nepos
[?] pschmae
[?] rendegast
----
[?] Noch keine Rückmeldung
[*] Zusage
[-] Absage
Vermutlich muesste man 'n Billig-
sort in
awk bauen, wenn man das vermeiden will.
Gruss Cae