Mit awk Zeilen von bis einlesen und weiterbearbeiten

pitti24

Grünschnabel
hallo leute,

suche nach einer möglichkeit mit awk zeilen von bis aus einer datei auszulesen.

aufbau der datei:

#BeginZeile
n1
n2
n3
#EndZeile
#BeginZeile
n1
n2
n3
n4
n5
n6
#EndZeile
#BeginZeile
n1
n2
#EndZeile

also ich möchte gerne die zeilen von #BeginZeile bis #EndZeile mit awk auslesen und weiterverarbeiten und am ende der datei soll schluss sein.
vielen dank für eure ratschläge!

grüße pitti24!
 
Auszug aus der gawk-Hilfedatei:
FS
This is the input field separator (see section 4.5 Specifying How Fields Are Separated). The value is a single-character string or a multi-character regular expression that matches the separations between fields in an input record. If the value is the null string (""), then each character in the record becomes a separate field. (This behavior is a gawk extension. POSIX awk does not specify the behavior when FS is the null string.)
The default value is " ", a string consisting of a single space. As a special exception, this value means that any sequence of spaces, tabs, and/or newlines is a single separator.(29) It also causes spaces, tabs, and newlines at the beginning and end of a record to be ignored.

RS
This is awk's input record separator. Its default value is a string containing a single newline character, which means that an input record consists of a single line of text. It can also be the null string, in which case records are separated by runs of blank lines. If it is a regexp, records are separated by matches of the regexp in the input text.
Setze deine Variable RS auf ein Pattern, das auf dein Start- und dein Ende-Tag passt. Eventuell musst du FS anpassen, wenn du es schon verändert hast, aber im Normalfall brauchst du das nicht.
Du hast auch die Möglichkeit, während des Programmlaufes FS und RS deinen Bedürfnissen anzupassen! In vielen Fällen ist die Verwendung der split-Funktion aber hinreichend.
 
hallo vereth,

vielen dank für deine antwort. komme leider nicht so richtig klar. könntest du mir bitte anhand meiner beispieldaten, den awk - befehl mal zeigen - DANKE!

viele grüße pitti24!
 
Code:
BEGIN{ RS = "(#BeginZeile)|(#BeginZeile[:space:]*#EndZeile)|(#EndZeile)"; }
[:space:] ist eine vordefinierte POSIX character list, die u.a. Leerzeichen, Tabs und Zeilenumbrüche enthält. Weitere nützliche character lists findest du in deiner Doku.
 
hallo vereth,

nochmals vielen dank für deine antwort. ich komme aber leider immer noch nicht so richtig weiter. vielleicht kann cih dir nochmal genauer erklären, was ich erreichen will

1.) ich habe eine datei mit folgenden inhalt:

#BeginOfPage
n01=001000
n02=003011
n03=001222
n04=0024754657
n05=' '
#EndOfPage
#BeginOfPage
n01=0034560
n02=0029999
n03=0043456
n04=0024754657
n05='wwwwwwww
n06='alteStadt'
#EndOfPage
#BeginOfPage
n01=004777737
n02=0020001
n03=003453
n04=00695734523
n05='opaundoma '
#EndOfPage

2.) ich möchte nun diese textdatei so bearbeiten, das ich die zeilen von #BeginOfPage bis #EndOfPage einlese und hier zeile für zeile durchgehe und die ersten 3 stellen nach dem = ausschneide und in einer schleife weiter bearbeite (als z.b. bei n01=0034560 die 003 ausschneide) und dann solle es mit den nächsten zeilen jeweils von #BeginOfPage bis #EndOfPage weiter so gehen.
vielleicht liege ich hier mit awk ja auch falsch - bin dankbar für alle iddeen!

viele grüße uwe!
 
Das könnte vielleicht ein passender Ansatz sein:
Code:
# wird von der BEGIN-Klausel
# für Initialisierungsarbeiten aufgerufen
function init()
{ status = 0; }

# extrahiert die interessanten Daten
# des aktuellen Records
# und hängt sie an das Array data an
function sammle()
{
  txt = $2;
  sub(/'/,"",txt);
  txt = substr(txt,1,3);
  data[++idx] = txt;
}

# verarbeitet die im Array data gespeicherten Daten
# Zu Demo-Zwecken wurde nur eine Ausgabe-Routine implementiert
function verarbeite()
{
  sep = "_";
  for ( i = 0; i++ < idx; )
  { printf("%s%s",sep,data[i]); }
  print sep;
}

BEGIN { init(); print; }
/#BeginOfPage/ {
  status = 1; # ab nun sind wir in einem Verarbeitungsblock
  idx = 0;
  FS="=";
  next;
}
/#EndOfPage/ {
  verarbeite();
  delete data;
  status = 0; # Verarbeitungsblock ist beendet
  FS=" ";
  next;
}
{ if ( status != 1 ) next; # Kein Verarbeitungsblock -> ignorieren
  sammle(); # Daten extrahieren und speichern
}
END { print "\n=== FERTIG ==="; }
 

Neue Beiträge

Zurück