Zwei bestimmte Zeilen mit einander verbinden (awk) [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Zwei bestimmte Zeilen mit einander verbinden (awk) [gelöst]

Beitrag von Duff » 27.06.2007 10:17:45

Hallo,

ich habe eine Datei, in der für zwei bestimmte patterns, diese beiden Zeilen in einer Zeile ausgeben möchte.

text
Pattern1
Pattern2
weiterertext
Pattern1
Pattern2
....

soll folgende Ausgabe ergeben:
Pattern1 Pattern2
Pattern1 Pattern2
...

Habe es mal mit awk und if(/pattern1/) {variable1=$1;} und mit pattern2 versucht und dann die ausgabe mit print variable1, variable2 versucht. Funktioniert aber leider nicht.

Noch jemand ne Idee?
Zuletzt geändert von Duff am 27.06.2007 20:07:11, insgesamt 1-mal geändert.
Oh, yeah!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 27.06.2007 11:05:33

Bisher habe ich das hier:

Code: Alles auswählen

#!/usr/bin/awk -f

/Pattern1:/ { x=$1" "$2" "$3 }
/Pattern2/ { y=$1 }

{print x," ",y;}
Jedoch werden mir so nur die Zeilen in Pattern1 Pattern2 ausgegeben. Nun hätte ich aber zusätzlich auch noch die Ausgabe der anderen Zeilen, in denen kein Pattern auftaucht.

Habe es mit if und else noch nicht wirklich hinbekommen...
Oh, yeah!

justusjonas
Beiträge: 44
Registriert: 09.03.2007 19:35:09

Beitrag von justusjonas » 27.06.2007 12:45:15

Hallo,

wenn Pattern2 strikt auf Pattern1 folgt, dann könnte evtl. folgendes helfen:

Code: Alles auswählen

cat test

text
Pattern1
Pattern2
weiterertext
Pattern1
Pattern2 

Code: Alles auswählen

awk '{ if (/Pattern1/) { ORS="" ;  print $1 " " } else { ORS="\n" ; print $1 } }' test

text
Pattern1 Pattern2
weiterertext
Pattern1 Pattern2
Grüße,

justusjonas

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 27.06.2007 20:06:52

Ja danke.

Genau sowas war es, was ich gesucht hatte.

OFS = output field separator
ORS = output record separator

...immer wieder die eingebauten Variablen in awk, die man (zumindestens ich) immer wieder vergesse. Danke.

[edit]
oder noch was kürzer:

Code: Alles auswählen

awk '{ ORS=/Pattern/ ? "" : "\n" } {print;}' file
[/edit]
Oh, yeah!

Antworten