Anzeige:
Ergebnis 1 bis 6 von 6

Thema: awk Dateien verarbeiten

  1. #1
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571

    awk Dateien verarbeiten

    habe zwar schon mit awk gearbeitet, den aber mehr oder weniger als Interpreter genutzt , weil ich unter UNIX kein Basic habe, zumindest nicht auf der Maschine.

    Jetzt habe ich die Aufgabe, aus Uniplex-Dateien die Steuersymbole (Druckeffekte, Seitenumbrüche, Tabulatoren, etc.) zu entfernen, so dass eine normale Textdatei übrig bleibt.

    Code:
    ####Tabulatoren Beispiele
    L....T..........T.......T.........
    ...L...T...........T.....C......T..........R
    
    ##### Druckeffekt Beispiel
    Hier steht sinnvoller Text@@
    UUUU       BBBBBBBBBB
    
    ##### Steuerbefehl Beispiele
    .SN #64
    .SL 66
    .PL
    Der Aufbau ist eigentlich ganz simpel.
    • Tabulatoren beginnen immer am Zeilenanfang. Mögliche Zeichen von Tabulatoren sind L, T, R, C, F und Punkt
    • Steuerbefehle beginnen immer am Zeilenanfang, beginnen immer mit einem Punkt gefolgt von mindestens zwei Großbuchstaben.
    • Steuertbefehle und Tabulatoren sind die einzigsten Einträge der Zeile, es folgt also kein Text.
    • Druckeffekte erkennt man am einleitenden @@. Dieses steht immer am Ende der Zeile. Die darauffolgende Zeile enthält die eigentlichen Effekte und sonst nichts.
    mit find . -name "99-[0-9]*" -print bekomme ich die Dateien angezeigt, also müsste mit
    find . -name "99-[0-9]*" -exec awk -f skript.awk {} \;
    die eigentliche Verarbeitung gestartet werden können. Aber was muß in script.awk stehen? Das ist mein Problem.

    Das ganze sollte dann noch als Datei mit der Endung .txt abgespeichert werden, aber das ist wohl das kleinste Problem.

    Bin für jede Starthilfe dankbar.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ich würde das jetzt mit Sed machen. Aber das ist wohl auch kein Problem, oder?
    Nein, zwar, grep genügt wohl schon.

    Zitat Zitat von Hans-Georg Normann
    [*]Tabulatoren beginnen immer am Zeilenanfang. Mögliche Zeichen von Tabulatoren sind L, T, R, C, F und Punkt
    die Regexp ist sowas:
    [.LTRCF]

    [*]Steuerbefehle beginnen immer am Zeilenanfang, beginnen immer mit einem Punkt gefolgt von mindestens zwei Großbuchstaben.
    \.[A-Z][A-Z][A-Z]*

    [*]Druckeffekte erkennt man am einleitenden @@. Dieses steht immer am Ende der Zeile. Die darauffolgende Zeile enthält die eigentlichen Effekte und sonst nichts.
    Da muss man schon schwereres Geschütz auffahren. Blöde nächste Zeile. Irgend eine Sed-Lösung. Gucke ich morgen mal (oder übermorgen) falls du das brauchst und sich nichts einfacheres findet.

    *Ideehab*:
    @@\n*
    geht zumindest scheinbar mit grep -v @@\n* - obs mit -e @@\n* auch geht - k.A., evtl brauchst du -e @@\n.*

    Alles jeweils mit grep -v, also
    Code:
    grep -v -e '[.LTRCF]' -e '\.[A-Z][A-Z][A-Z]*' -e '@@\n*'
    Ist aber ungetestet (wie verlangt nur ein Ansatz )

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    sed ist auch kein Problem. Dachte mir nur, dass awk flexibler ist, sprich das script leicht erweiterbar ist.

    Wenn ich den Dateinamen in einer Umgebungsvariable speichern würde, und awk anweisen würde /dev/null mit dem script.awk zu bearbeiten, dann wüsste ich wie ich es anstelle. Das ist aber genau das, was ich als "script interpreter" bezeichne. Ich weiß, dass man das auch anders machen kann. Ich kenne aber leider (noch) keinen, der weiß wie es geht. Soll halt auch ein Lerneffekt bei sein.

    Wenn ich mit sed arbeite dann müßte ich mit
    Code:
    1,$g/@@$/+1d
    1,$s/@@$//
    das Problem doch in den griff bekommen, oder hält sich sed nicht an die vorgegeben Hirarchie.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Was willst du mit /dev/null anstellen?
    Den Sed-Code peil ich auch gar nicht.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Zitat Zitat von peschmae
    Den Sed-Code peil ich auch gar nicht.
    OK, da sind die Pferde mit mir durchgegangen. Habe bereits gemerkt, dass sed!=vi ist.

    Zitat Zitat von peschmae
    Was willst du mit /dev/null anstellen?
    Wenn ich den awk als Interpreter missbrauche, dann geht's auch mit /dev/null. Ohne Fileangabe geht's nicht.

    Ich habe mich jetzt nocheinmal hingesetzt und erst mal nach alter Gewohnheit was zurechtgezimmert. Das ist bis jetzt dabei herausgekommen:

    Ich habe eine Datei file.list, in der alle dateien verzeichnet sind. Wie ich die (richtig) in awk einbinde, habe ich noch nicht herausbekommen.

    Dann gibt es ein bash script, welches das ganze ausführt. Die Variable UAPFILE ist ein Notbehelf, aber damit habe ich das ersteinmal zum Laufen gebracht.
    Code:
    #!/usr/bin/bash
    
    export UAPFILE=99-45783
    
    #awk -f uniplex2text.awk /dev/null
    awk -f uniplex2text.awk file.list
    ind hier das awk script
    Code:
    BEGIN {
      System_Init()
      Uniplex_Convert()
      exit 0
    }
    
    function System_Init() {
      false=0
      true=!false
      UAPFILE=ENVIRON["UAPFILE"]
      TEXTFILE=(UAPFILE ".txt")
    }
    
    function Uniplex_Convert() {
      EFFECT=false
    
      while (getline < UAPFILE > 0) {
        TEXT=$0
        if (EFFECT) {
          EFFECT=false
          continue
        } 
    
        MATCH=substr(TEXT,length(TEXT)-1)
        print ("MATCH=" MATCH)
        if (MATCH == "@@") {
          TEXT=substr(TEXT,1,length(TEXT)-1)
          EFFECT=true
          print TEXT > TEXTFILE
          continue
        }
    
        print TEXT > TEXTFILE
      } 
        
      close(UAPFILE)
      close(TEXTFILE)
    }
    Liefert brauchbares, auch wenn ich mit "der harten Nuss" angefangen habe. Der Rest sollte auch gehen.

    Upload scheint nicht zu gehen, aber wer Interesse hat kann sich die Datei hier downloaden. ca. 1 kB gross.

    Hans
    Geändert von Hans-Georg Normann (08-10-2004 um 21:25 Uhr)
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  6. #6
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    04.03.2000
    Ort
    Uetersen
    Beiträge
    571

    Talking Jetz schnall ich auch wie awk arbeitet

    Ist ja eigentlich gaaaanz einfach und ich war auch schon gaaanz nah dran. Also in das BEGIN kommen nur Sachen rein, die vor Scriptverarbeitung bekannt sein sollten. Außer true und false habe ich d jetzt nichts mehr stehen.

    und dann legt man mit seinen Regexpressions los. Immer Regexpression {Befehle oder Funktion}. Ich habe als Regexpression // { eingebaut. Das bedeuted, dass die jeweils aus file.list gelesene Zeile in $0 wiederzufinden ist. Im Klartext sieht das jetzt so aus
    Code:
    BEGIN {
      System_Init()
    }
    
    // {
         UAPFILE=$0
         TEXTFILE=(UAPFILE ".txt")
         fTIME=strftime("%T %Z")
         printf "%s: converting file: %s\n", fTIME, $0
         Uniplex_Convert()
    }
    Der Rest ist mit dem Code aus den vorigen Posts identisch. Und wie immer, wer will kann sich den Code hier ziehen. Nicht mal 1 kb, sollte auch Einsteiger nicht überfordern.

    Meine Probleme betrachte ich damit als gelöst, denn der Rest ist jetzt nur noch Fleißarbeit.

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

Lesezeichen

Berechtigungen

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