mikrocontroller.net

Forum: PC-Programmierung Frage zu AWK


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie kann ich mit AWK in einem File nach Strings suchen und diese 
nacheinander in das gleiche Logging ausgeben?

Mit der Version werden ja zwei Ziele angelegt. Wie kann man die Suche 
gestalten, so dass die ganzen Antworten nacheinander in einem Ziel 
landen?


gawk "/Suchwort1/{print(substr($9,1,6))}" Quelle.txt > Ziel1.txt
gawk "/Suchwort2/{print(substr($9,1,4))}" Quelle.txt > Ziel2.txt


Danke sehr!
Klaus

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht so?

gawk "/Suchwort1/{print(substr($9,1,6))}" Quelle.txt > Ziel1.txt
gawk "/Suchwort2/{print(substr($9,1,4))}" Quelle.txt >> Ziel1.txt

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder so:
gawk "/Suchwort1/{print(substr($9,1,6))}; /Suchwort2/{print(substr($9,1,4))}" Quelle.txt > Ziel1.txt

Je nachdem was "nacheinander" bedeutet.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch so passt das schon!

Super für die schnelle Antwort!

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich greife mal die Frage auf.

Wenn man es so nutzt:
gawk "/Suchwort1/{printf(substr($9,1,6))}; 
/Suchwort2/{printf(substr($9,1,4))}" Quelle.txt > Ziel1.txt

werden die einzelnen Strings nacheinander in das Zielfile geschrieben. 
Jedoch bekomme ich es nicht hin, dass er nach den 2 Suchwort eine neue 
Zeile beginnt. (habe \n genutzt ... leider geht es nicht so wie es soll)

Hat jemand einen Tipp?
Danke

Autor: Thomas Pircher (tpircher) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das printf in awk verhaelt sich so wie das in C.
gawk "/Suchwort1/{printf("%s\n", substr($9,1,6))};
 /Suchwort2/{printf("%s\n", substr($9,1,4))}" Quelle.txt > Ziel1.txt

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DANKE!"

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hab ich mich zu früh bedankt.
folgender Ausdruck:

gawk "/Suchwort1/{printf("%s\t"), substr($5,1,3); 
/Suchwort2/{printf("%s\n",substr($5,1,5))}" Quelle.txt > Ziel.txt


führt zu einem unterminated regexp beim printf.... Habe auch das 
Problem, dass die Nutzung von \n oder \t in den AUsdrücken nicht 
bearbeitet wird. Vielleicht ist mein Windows AWK doch nicht ganz 
kompatibel?

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mich da verschrieben:

gawk "/Suchwort1/ {printf("%s"), substr($5,1,3)}; Suchwort2 
{printf("%s\n"), substr($5,1,5)}"    Quelle.tmp > Ziel.txt


Und erhalte nun ein unexpected Newline {printf(/ ???

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fred schrieb:
> Da hab ich mich zu früh bedankt.
> folgender Ausdruck:
>
> gawk "/Suchwort1/{printf("%s\t"), substr($5,1,3);
> /Suchwort2/{printf("%s\n",substr($5,1,5))}" Quelle.txt > Ziel.txt

Da sind gleich zwei Fehler drin:

1. die Schließende Klammer beim ersten printf kommt schon nach dem 
Formatstring, gehört aber vor den Strichpunkt.

2. Du verwendest das gleiche Quote-Zeichen ("), um das awk-Programm von 
der Shell abzugrenzen und für die Formatstrings innerhalb des Programms. 
Das kann gut gehen, wenn die Inhalte "gutmütig" sind, Strings wie \n und 
\t gehören dazu aber nicht. Um auf der sicheren Seite zu sein, solltest 
Du für das awk-Programm aber entweder single-Quotes verwenden (falls 
Windows das kann) oder es gleich in eine separate Datei schreiben.

Also entweder

 gawk '/Suchwort1/{... "%s\t" ...}; ...'

oder

 gawk -f script.awk

wobei script.awk dann so aussieht:

 /Suchwort1/{...}
 /Suchwort2/{...}

Die Punkte sind natürlich jeweils durch den entsprechenden Programmtezt 
zu ersetzen.

Bevor jetzt jemand kommt und sagt, da gibt es aber noch eine dritte 
Möglichleit (nämlich die "inneren" Gänsefüßchen mit Backslash zu quoten) 
— die habe ich bewußt weggelassen, weil damit das Programm sehr schnell 
sehr unübersichtlich wird, und man nicht mehr weiß, welcher Backslash 
und welches Dollarzeichen auf welcher Ebene interpretiert werden.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Schreibfehler hatte ich ja schon bemerkt. Die " Doppelverwendung war 
das Problem. Mit dem Skript File passt es nun. Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.