Anzeige:
Ergebnis 1 bis 12 von 12

Thema: AWK Frage (Anfänger)

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7

    AWK Frage (Anfänger)

    Hallo,
    mir kann bestimmt leicht geholfen werden, da ich wirklich ein blutiger Anfänger bis. Ich beschäftige mich erst seit heute mit awk und versuche damit ein kleines Programm zu schreiben, mit dem ich meine log-files auslesen kann.

    Es geht um die Zeile:
    sub("begin schema", "Form")

    Diese ersetzt mir den String "begin schema" mit dem String "Form". Ich hätte allerdings gerne, dass das Programm das nur beim allerersten Treffer macht und nicht für jeden Treffer. Ich hab's mit einer while-Schleife versucht, das funktioniert aber nicht, weil das Programm scheinbar bei jeder Zeile neu durchlaufen wird.

    Kann mir jemand verständlich erklären, was ich falsch mache?

    Gruß und Danke,
    S.

  2. #2
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von hand44 Beitrag anzeigen
    Hallo,
    Kann mir jemand verständlich erklären, was ich falsch mache?

    Gruß und Danke,
    S.
    Setzte mal deine while() Schleife in den BEGIN{} Block.
    Dann kannst Du auch wie gewohnt damit arbeiten.
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7
    Danke für den Tipp. Ich hab jetzt ne Weile probiert, aber krieg's einfach nicht hin. Könnte vielleicht jemand ein komplettes Skript für das unten stehende Beispiel schreiben? Das würde mir wirklich weiterhelfen. (Äh.. natürlich nur, wenn das nicht so lang ist. Ich glaube ja immer noch, dass das nur ein paar Zeilen sind...)
    Wär total nett

    Eingabe:
    -------------
    Gruppe: Obst
    Name: Apfel
    Farbe: grün
    Gruppe: Obst
    Name: Birne
    Farbe: gelb
    Gruppe: Obst
    Name: Kirsche
    Farbe: rot
    Gruppe: Gemuese
    Name: Karotte
    Farbe: orange
    Gruppe: Gemuese
    Name: Kohlrabi
    Farbe: grün
    Gruppe: Gemuese
    Name: Tomate
    Farbe: rot
    -------------

    Ausgabe:
    -------------
    3 Obstsorten:
    Apfel
    Birne
    Kirsche

    3 Gemuesesorten:
    Karotte
    Kohlrabi
    Tomate
    -------------
    Geändert von hand44 (19-02-2007 um 10:38 Uhr)

  4. #4
    Registrierter Benutzer Avatar von Romanday
    Registriert seit
    03.02.2004
    Beiträge
    829
    Zitat Zitat von hand44 Beitrag anzeigen
    Äh.. natürlich nur, wenn das nicht so lang ist. Ich glaube ja immer noch, dass das nur ein paar Zeilen sind...)
    Hab gerade mal ein wenig rumprobiert.
    So einfach ist das nicht.
    Reicht dir auch eine PHP Lösung?
    Geändert von Romanday (20-02-2007 um 09:08 Uhr)
    Abriss, bzw. die Sprengung des World Trade Centers
    WDR Dokumentation
    Doku + DT Untertitel
    Weitere Infos - Terrorstorm

  5. #5
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7
    Hallo Romanday,
    danke für dein Angebot . PHP halte ich nicht für so geeignet, da das Prog auch auf einem normalen Windows-Rechner laufen soll. Ich weiß auch nicht, ob PHP mit großen Textdateien so gut klar kommt wie AWK (30 Mbyte und größer).

    Deshalb nochmal zu AWK. Ich denke, ich hätte einen Ansatz, wenn ich den Inhalt der jeweils nächsten Zeile abfragen könnte. Das hab ich aber bislang nicht hinbekommen. Also zB die Schleife
    if($0 == "irgendwas") oder if($0 ~ "irgendwas")
    wurde für jede Zeile ausgeführt, weil der Ausdruck $0 == "irgendwas" wohl immer wahr ist. Das kapier ich nicht so ganz. Weiß jemand, wie ich eine funktionierende Schleife der Art bauen könnte für das Beispiel oben? Also eine korrigierte Version von dieser:
    if($0 ~ "Obst")

    Danke,
    sileem
    Geändert von hand44 (19-02-2007 um 08:20 Uhr)

  6. #6
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Moin moin,
    Zitat Zitat von hand44 Beitrag anzeigen
    Deshalb nochmal zu AWK. Ich denke, ich hätte einen Ansatz, wenn ich den Inhalt der jeweils nächsten Zeile abfragen könnte. Das hab ich aber bislang nicht hinbekommen. Also zB die Schleife
    if($0 == "irgendwas") oder if($0 ~ "irgendwas")
    wurde für jede Zeile ausgeführt, weil der Ausdruck $0 == "irgendwas" wohl immer wahr ist. Das kapier ich nicht so ganz. Weiß jemand, wie ich eine funktionierende Schleife der Art bauen könnte für das Beispiel oben? Also eine korrigierte Version von dieser:
    if($0 ~ "Obst")
    wenn ich das richtig sehe, dann ist z.B. bei der ersten Zeile Deiner Liste
    $0 "Gruppe: Obst"
    $1 "Gruppe:"
    $2 "Obst"
    frag also lieber if($1=="Gruppe:") und dann, ob Du $2 schonmal hattest;-)

    Ist eigentlich gewährleistet, daß die Liste zmindest den Gruppen nach sortiert ist?
    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  7. #7
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7
    Moin!
    Durch den letzten Tipp und durch Ausprobieren bin ich jetzt noch einen Schritt weiter gekommen: Der Code:

    BEGIN {
    obst=1;
    gemu=1;
    sprit=1;
    }

    {
    if($1=="Gruppe:")
    {
    if(obst==1 && $2=="Obst")
    print "Obstsorten";
    }
    {
    if(obst==1 && $2=="Obst")
    obst=0;
    }
    {
    if(gemu==1 && $2=="Gemuese")
    print "\nGemuesesorten";
    }
    {
    if(gemu==1 && $2=="Gemuese")
    gemu=0;
    }
    }

    sub("Name: ","");

    bringt folgende Ausgabe:

    Obstsorten
    Apfel
    Birne
    Kirsche

    Gemuesesorten
    Karotte
    Kohlrabi
    Tomate

    Jetzt fehlt mir noch die Anzahl der Obst- und Gemüsesorten an der jeweiligen Stelle. Geht das überhaupt?
    Geändert von hand44 (19-02-2007 um 13:22 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7
    So. Ich hab's jetzt fast komplett selbst hinbekommen :-). Ich hab nur noch eine letzte kleine Frage. Ich habe eine Eingabe nach der Art:

    Name: 111 222 333 444 555

    Und möchte per print nur ausgeben:
    111 222 333 444 555

    So hab ich's gemacht:
    {
    if($1==Name)
    print $3,$4,$5,$6,$7
    }

    Das Problem ist, dass wenn ich eine Zeile habe wie zB
    Name: 111 222
    sieht die Ausgabe zwar auch brauchbar aus, aber für die überflüssigen Felder wird dann je ein Leerzeichen angehangen.

    Meine Frage lautet also: Ist es direkt möglich, einfach alles rechts ab $3 auszugeben? Egal, wieviele Felder da stehen?

    Gruß und Danke,
    Sileem

  9. #9
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Siehe man tr und wc
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  10. #10
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7
    Äh... Uff!

    Trotzdem Danke.

  11. #11
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    mit awk vllt:
    awk -F ":" '{ if($1=="Name") print $2 }' foo
    so das ":"-Zeichen nur 1x pro Zeile vorkommt.
    Hat's mit dem Zählen denn schon geklappt?
    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  12. #12
    Registrierter Benutzer
    Registriert seit
    17.02.2007
    Beiträge
    7
    Hi rais,

    danke für den Tipp. Werde ich heute Nachmittag mal testen.
    Das mit dem Zählen hab ich noch nicht in Angriff genommen. Wahrscheinlich mache ich das einfach unter den Haupttext - dann ist es wesentlich einfacher.

    Gruß und Danke
    Sileem

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •