ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
1437
1437
EMPFEHLEN
-
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:
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.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.
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.
-
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!
-
[: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.Code :
1
BEGIN{ RS = "(#BeginZeile)|(#BeginZeile[:space:]*#EndZeile)|(#EndZeile)"; }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.
-
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 :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
-
BATCH - Zeilen- und Spaltenweise einlesen und ausgeben
Von d-braun im Forum Sonstige SprachenAntworten: 5Letzter Beitrag: 17.11.09, 10:40 -
Wie mehrere Zeilen gleichzeitig aus Datei einlesen?
Von kela_root im Forum JavaAntworten: 4Letzter Beitrag: 25.09.09, 17:01 -
Datei einlesen und Anzahl der Zeilen bestimmen
Von bastionmancher im Forum C/C++Antworten: 5Letzter Beitrag: 09.06.07, 16:08 -
alle zeilen einer datei einlesen
Von lambofgod im Forum C/C++Antworten: 0Letzter Beitrag: 28.05.07, 20:57 -
[C++] Die einzelnen Zeilen einer Textdatei einlesen
Von onkelv im Forum C/C++Antworten: 2Letzter Beitrag: 07.10.04, 23:43





Zitieren
Login





