tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1437
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    pitti24 pitti24 ist offline Rookie
    Registriert seit
    May 2010
    Beiträge
    5
    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!
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    pitti24 pitti24 ist offline Rookie
    Registriert seit
    May 2010
    Beiträge
    5
    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!
     

  4. #4
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Code :
    1
    
    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.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  5. #5
    pitti24 pitti24 ist offline Rookie
    Registriert seit
    May 2010
    Beiträge
    5
    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!
     

  6. #6
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Das könnte vielleicht ein passender Ansatz sein:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    # 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 ==="; }
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

Ähnliche Themen

  1. BATCH - Zeilen- und Spaltenweise einlesen und ausgeben
    Von d-braun im Forum Sonstige Sprachen
    Antworten: 5
    Letzter Beitrag: 17.11.09, 10:40
  2. Antworten: 4
    Letzter Beitrag: 25.09.09, 17:01
  3. Datei einlesen und Anzahl der Zeilen bestimmen
    Von bastionmancher im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 09.06.07, 16:08
  4. alle zeilen einer datei einlesen
    Von lambofgod im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 28.05.07, 20:57
  5. Antworten: 2
    Letzter Beitrag: 07.10.04, 23:43