# Mit awk Zeilen von bis einlesen und weiterbearbeiten



## pitti24 (14. Mai 2010)

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!


----------



## Vereth (14. Mai 2010)

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.
> 
> ...


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.


----------



## pitti24 (14. Mai 2010)

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!


----------



## Vereth (14. Mai 2010)

```
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.


----------



## pitti24 (17. Mai 2010)

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!


----------



## Vereth (17. Mai 2010)

Das könnte vielleicht ein passender Ansatz sein:

```
# 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 ==="; }
```


----------

