2016-03-23 17 views
0

Ich habe gekämpft, um herauszufinden, wie Zeilen in einer Protokolldatei (mit 2 Zeilentrennzeichen - '@' und '|') "getrennt" werden, so dass alle Zeilen mit einem Zeitstempel verbunden sind eine Linie.Merge-Linien basierend auf Muster

Example: 
2016-03-22 blah blah blah 
|blah blah 
|blah blah blah 
@blah 
|blah blah blah 
2016-03-22 blah blah blah 
|blah blah blah 
@blah blah 
@blah blah blah 
|blah 

erforderliche Ausgabe

2016-03-22 blah blah blah |blah blah |blah blah blah @blah |blah blah blah 
2016-03-22 blah blah blah |blah blah blah @blah blah @blah blah blah |blah 

Ich dachte, ich hätte diese sussed einfach durch xarg mit alles auf eine Zeile setzen dann sed mit neuen Linien bei 2016 hinzufügen, aber ich entdeckte, gibt es eine Grenze auf Zeichen In einer Zeile und die Protokolldatei ist so groß, dass xargs mehrere Zeilen erstellt hat.

Entfernen des Wagenrücklaufs von Zeilen, die mit | beginnen und @ würde das lösen, aber ich kann mir auch nicht vorstellen, wie das geht.

Ich habe hier gesucht und ein paar Leute gefunden, die ähnliche Fragen stellen, aber ich kann einige der Lösungen nicht interpretieren, die zu meinem Problem passen, da ich sed/awk/xargs nicht gut genug kenne.

Ich würde mich freuen, wenn jemand einige Vorschläge anbieten kann.

Dank

+0

Sie verbringen Stunden damit, ein Problem nicht zu lösen. Du postest dann eine Frage. 5 Minuten später finden Sie die Lösung! 'cat datei | sed ': a; N; $! Ba; s/\ n// g' | sed 's/2016 -/\ n2016-/g'' – Gareth

+0

Datei als Antwort und erkläre es . –

Antwort

1

können Sie diesen awk Befehl verwenden:

awk '/^[0-9]{4}(-[0-9]{2}){2}/ { 
    if (p!="") 
     print p 
    p=$0 
    next 
} 
{ 
    p = p OFS $0 
} 
END { 
    print p 
}' file 

2016-03-22 blah blah blah |blah blah |blah blah blah @blah |blah blah blah 
2016-03-22 blah blah blah |blah blah blah @blah blah @blah blah blah |blah 
0

der anubhava Antwort funktioniert, aber es puffert die Gesamtheit jeder Zeile vor dem Drucken.

Dies wird gedruckt, während jede Eingabezeile gelesen wird.

awk '{printf "%s%s", /^[|@]/?OFS:(NR>1)?"\n":"", $0} END{print ""}' 
  • /^[|@]/ Linien Übereinstimmung mit @ oder |
  • ?OFS wenn abgestimmte Führung mit OFS (output Feldseparator, Raum durch Vorgabe)
  • : sonst
    • (NR>1) wenn wir ‚beginnend aren t in der ersten Zeile
    • ?"\n" Ausgang ein Newline
    • :"" sonst Ausgabe
  • END{print ""} sicherstellen, dass wir die letzte Zeile mit einem Newline Ende
0

Dies ist ein Rohling (eine Leerzeile am oberen Ende der Ausgabe zu vermeiden) könnte für Sie arbeiten (GNU sed):

sed ':a;N;/\n....-..-.. /!s/\n/ /;ta;P;D' file 

lesen zwei Linien in den Musterraum und wenn das Neue-Zeile ist nicht der Beginn einer neuer Datensatz, ersetze ihn durch ein Leerzeichen und wiederhole, d. h. füge eine andere Zeile an die bestehende an usw. Wenn die angehängte Zeile der Anfang eines neuen Datensatzes ist, drucke die erste Zeile, lösche sie und wiederhole sie.

0

die Zeilenumbrüche entfernen, eine neue Zeile am Ende der Zeile hinzufügen, und fügen Sie neue Zeilen vor jedem 2016:

echo '2016-03-22 blah blah blah 
|blah blah 
|blah blah blah 
@blah 
|blah blah blah 
2016-03-22 blah blah blah 
|blah blah blah 
@blah blah 
@blah blah blah 
|blah ' | tr -d '\n' | sed -e 's/$/\n/' -e 's/2016-/\n2016-/g' 
0

Aber wie Linien (nur Worte aus Linien), fusionieren, wenn dieses Wort in beiden Dateien vorhanden ? Alle Wörter ändern sich automatisch und die Dateien 1.txt und 2.txt ändern sich automatisch auch als Teil des Paketmanagers in Gnome 2-Umgebung. Und "link" bedeutet http://link

Beispiel INPUT:

1.txt enthält erfasst http und Version der Pakete:

link1/Autotools-dev_20100122.1

link4/debhelper_8.0.0

link5/dreamchess_0.2.0

link5/dreamchess_0.2.0-2

link7/quilt_0.48

link7/quilt_0.48-7

link34/stepp el_0.46.2

link34/stepp el_0.46.2-1

2.txt enthält alle benötigten Erweiterungen der Pakete:..

Autotools-dev _ * diff.gz

debhelper _ * diff.gz

debhelper _ *.

libmxml-dev _ * orig.tar.gz. Diff.gz

libmxml-dev _ *. DSC-

libmxml-dev _ *. Orig.tar.gz

libsdl1.2-dev _ *. diff.gz

libsdl1.2-dev _ *. dsc

libsdl1.2-dev _ *. orig.tar.gz

libsdl-image1.2-dev _ *. Diff.gz

libsdl-image1.2-dev _ *. DSC-

libsdl-image1.2-dev _ *. Orig.tar.gz

.

Quilt _ * diff.gz

SOLL-Ausgabe in Datei 3.txt:

link1/Autotools-dev_20100122.1.diff.gz

link4/debhelper_8.0.0.diff.gz

link4/debhelper_8.0.0.orig.tar.gz

libmxml-dev _ *. diff.gz

libmxml-dev _ *. DSC-

libmxml-dev _ *. orig.tar.gz

libsdl1.2-dev _ *. Diff. gz

libsdl1.2-dev _ *. dsc

libsdl1.2-dev _ *. orig.tar.gz

libsd l-image1.2-dev _ *. diff.gz

libsdl-image1.2-dev _ *. DSC-

libsdl-image1.2-dev _ *. orig.tar.gz

link7/quilt_0.48.diff.gz

link7/quilt_0.48-7.diff.gz

So benötigt Skript, die in Dateien 1.txt und 2.txt erkennt automatisch Name gemeinsames Paket und 3 einzureichen. txt geeignete Einfügungen in die gleiche Zeile, in der der Paketname existiert:

  • http und Version von Datei 1.txt

  • Erweiterung von Datei 2.txt

  • Zeilen aus der Datei 2.txt, die nicht Paketnamen in der Datei 1.txt

enthalten
Verwandte Themen