Ich habe eine Protokolldatei, die ich in mehrere Dateien aufteilen möchte
Inhaltsverzeichnis
*** Configuration Database
*** Logs
*** Configuration Logs
*** Query Logs
.
.
and so on
Das Problem besteht darin, dass die Titel des Abschnitts mit den entsprechenden Daten oder Protokollen zwischen den Abschnitten erneut im Textkörper angezeigt werden. Daher müsste ich nach der zweiten Instanz jedes Titels suchen und die Daten bis zur zweiten Instanz des nächsten Titels kopieren.
Körper
*** Configuration Database
(Data/Logs)
*** Logs
(Data/Logs)
*** Configuration Logs
(Data/Logs)
*** Query Logs
(Data/Logs)
Ich möchte grundsätzlich die Debug-Textdatei nehmen, ein Skript darauf ausführen und die Datei in mehrere Textdateien aufteilen lassen, eine für jeden Abschnitt im Inhaltsverzeichnis, wobei das Original intakt bleibt. Ich hätte also grundsätzlich debug.txt, Configuration Database.txt, Logs.txt usw., die jeweils alle Daten in jedem Abschnitt enthalten, bis der neue Abschnitt beginnt. Für jede Hilfe wäre ich sehr dankbar, da mir das etwas zu hoch ist :)
Antwort1
Versuche dies:
awk '/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];} fname{print>fname}' file
Wie es funktioniert
awk liest eine Datei implizit Zeile für Zeile. Für jede gelesene Zeile führen wir Folgendes aus:
/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];}
Bei jeder Zeile, die mit drei Sternen und einem Leerzeichen beginnt, prüfen wir, ob wir diese Zeile schon einmal gesehen haben. Wenn ja, setzen wir
fname
auf diese Zeile. Andernfalls aktualisieren wir das assoziative Array,seen
um anzuzeigen, dass wir diese Zeile schon einmal gesehen haben.fname{print>fname}
Wenn
fname
es sich um einen nicht leeren Wert handelt, schreiben Sie die aktuelle Zeile in die Datei mit dem Namenfname
.