ist Wie andere gesagt haben, Sie haben nicht angegeben, was Sie mit den Daten tun wollen, sobald Sie haben analysierte es.
Wenn Sie nur einen bestimmten Brocken extrahieren möchten, sollte die Antwort von Akshay Hegde gut funktionieren.
Wenn Sie jeden Datensatz mit etwas mehr awk-Funktionalität verarbeiten möchten, z. B. die Ausgabe in irgendeiner Weise transformieren (z. B. Verbinden der Zeilen usw.), benötigen Sie wahrscheinlich etwas anderes.
Es gibt ein paar ziemlich einfache Möglichkeiten, die Sie tun können, aber ich denke, der beste Ansatz ist wahrscheinlich, das Datensatztrennzeichen zu ändern.
Die Möglichkeit, einen regulären Ausdruck als Datensatztrennzeichen zu verwenden, ist eine gawk-Erweiterung, aber Sie verwenden wahrscheinlich gawk, wenn Sie unter Linux sind. Hier
ist der Inhalt eines gaffen Programmdatei „prog.awk“:
function process_group(name, body) {
print "Got group with name '" name "'";
print body;
}
BEGIN {
RS="(\n|^)\\S+:"
PREV=""
}
{
if (PREV!="") {
process_group(gensub(/\n?(\S+):/, "\\1", "", PREV), $0);
}
PREV=RT
}
du
gawk -f prog.awk input.txt
mit ausführen können Alternativ können Sie das Ganze auf dem gaffen command- setzen Zeile, aber es ist einfacher zu lesen, wenn es schön formatiert ist.
Die Idee ist, dass es jedes Mal, wenn es das Datensatztrennzeichen sieht, den Inhalt seit dem letzten Datensatztrennzeichen oder dem Anfang der Datei gibt. Dies bedeutet, dass beim ersten Anzeigen des Datensatztrennzeichens der untere Block mit dem Datensatztrennzeichen "foo:" und ein leerer Textkörper aufgerufen wird, beim zweiten Anzeigen des Datensatztrennzeichens der Block mit "bar:" und der Inhalt dazwischen aufgerufen wird "foo:" und "bar:" usw.
Dies bedeutet, dass das den einzelnen Blöcken entsprechende Record-Trennzeichen das vorherige und nicht das aktuelle Trennzeichen ist. Dies ist leicht zu handhaben, indem das vorherige Datensatztrennzeichen in der "PREV" -Variable verfolgt wird.
So legt der BEGIN-Block das Datensatztrennzeichen RS fest und initialisiert PREV als leer.
Der Block am Ende wird für jeden von RS begrenzten Datensatz aufgerufen, und noch einmal am Ende der Datei.
Wenn "PREV" nicht leer ist, ruft es die Funktion "process_group" mit den aktuellen Körperdaten und dem vorherigen Datensatzseparator auf (die uninteressanten Bits von PREV auf dem Weg mit gensub entfernen). Anschließend ordnet es das aktuell passende Datensatztrennzeichen (RT) der PREV zur nächsten Verwendung zu.
In "process_group" können Sie jede gewünschte Verarbeitung mit jeder Gruppe durchführen. In diesem Fall drucke ich sie nur aus, aber es sollte einfach zu ändern sein, um zu tun, was immer du willst.
nicht beschreiben, wie die Ausgabe aussehen soll, zeigen Sie es im Codeblock. – Kent
Und irgendeine Art von Versuch wäre nett. – grail
Es ist ziemlich schwierig, das Problem ohne erwartete Ausgabe zu verstehen – anubhava