Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 22 von 22

Thema: SED - Frage zu bearbeitung von Messdaten

  1. #16
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Du kannst die Ranges genauer definieren:

    Code:
    jan@jack:~/tmp/wind> cat data
    340.12 356.32182.34 350.12    # eindeutig: 5 Stellen trennen nach 2. NK-Stelle
    340.34 33.1234.22 12.12       # nicht eindeutig (33.1 234.22 oder 22.12 34.22) -> -9999
    340.34 33.1359.99 12.12       # dito (33.13 59.99 oder 33.1 359.99)
    340.34 33.1360.00 12.12       # dito (33.13 60.00 oder 33.1 360.00)
    340.34 33.1360.01 12.12       # eindeutig: 33.13 60.01
    340.34 33.1361.01 12.12       # eindeutig: 33.13 61.01
    340.34 33.1400.00 12.12       # eindeutig: 33.14 00.00
    
    jan@jack:~/tmp/wind> cat repair.sed
    s/ [0-9]*\.[0-9][0-3]60\.0* / -9999 -9999 /g
    s/ [0-9]*\.[0-9][0-3][0-5][0-9]\.[0-9]* / -9999 -9999 /g
    s/\(\.[0-9][0-9]\)\([0-9][0-9]\.\)/\1 \2/g
    s/\(\.[0-9][0-9]\)\([0-9][0-9][0-9]\.\)/\1 \2/g
    jan@jack:~/tmp/wind> sed -f repair.sed data
    340.12 356.32 182.34 350.12    # eindeutig: 5 Stellen trennen nach 2. NK-Stelle
    340.34 -9999 -9999 12.12       # nicht eindeutig (33.1 234.22 oder 22.12 34.22) -> -9999
    340.34 -9999 -9999 12.12       # dito (33.13 59.99 oder 33.1 359.99)
    340.34 -9999 -9999 12.12       # dito (33.13 60.00 oder 33.1 360.00)
    340.34 33.13 60.01 12.12       # eindeutig: 33.13 60.01
    340.34 33.13 61.01 12.12       # eindeutig: 33.13 61.01
    340.34 33.14 00.00 12.12       # eindeutig: 33.14 00.00
    Das Script repair.sed führt nacheinander mehrere Ersetzungen durch, von den Spezialfällen hin zu den allgemeineren. Damit können die nachfolgenden Bedingungen auch unschärfer formuliert werden.

    Jan

  2. #17
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Jan, du bist ein Genie. Herzlichen Dank.

  3. #18
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Hallo zusammen,
    mir ist noch ein letztes Problem aufgefallen.

    Manchmal existieren Tag, an denen für einen Parameter keine Wert vorliegt. Das sieht dann so aus.

    07 06 20 21 00
    D R 34.46 29.93 32.86 40.93 50.57 67.48 82.48 88.01 103.3 108.5 113.0257.46284.39 184.1 159.0
    07 06 21 10 00
    07 06 21 10 30
    07 06 21 11 00
    07 06 21 11 30
    07 06 21 12 00
    07 06 21 09 00
    07 06 21 09 30
    07 06 21 10 00
    07 06 23 07 00
    D R 99.55221.51214.74335.71203.96332.40 19.63306.53 189.1 182.9 174.5 145.3 132.6345.79359.00
    07 06 23 07 30
    D R 180.2355.01254.05 166.9307.77328.01212.07325.39 169.2 141.9320.26 41.88339.97293.37359.00
    07 06 23 08 30
    07 06 23 09 00
    07 06 23 09 30
    07 06 23 10 00
    07 06 23 10 30
    07 06 23 11 00
    07 06 23 11 30
    07 06 25 18 00
    D R 199.8203.32280.28 48.93 4.264 7.668 144.8 168.8 162.5 109.3 6.742 152.8 167.7 45.13 6.003
    07 06 28 12 30
    D R 18.00268.07272.80265.62260.17270.94261.43210.53 3.977348.91 65.77 180.7 66.21243.38 58.31
    07 06 28 13 00
    D R 18.00256.00239.76257.04263.73260.40265.37256.78245 .86 194.6269.56 45.33217.10 34.99 162.1
    07 06 28 13 30
    Ist es irgendwie möglich, dass wenn mehrere Datumsstempel hintereinander kommen, alle bis auf den untersten zu löschen?

  4. #19
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    das kannst Du elegant mit einem kleinen awk lösen:
    Code:
    awk ' /^[0-9]/ {ln=$0;} /^D/ {printf "%s\n%s\n",ln,$0;} ' data
    awk merkt sich jede Zeile, die mit einer Ziffer beginnt, in der Variablen ln. Wenn eine Zeile mit einem "D" beginnt, dann gibt er die letzte gespeicherte Zeile und die aktuelle Zeile aus.

    Jan

    EDIT: Weils so schön und kurz ist, hier noch eine Variante mit sed ;-)
    Code:
    sed -n '/^[0-9]/h;/^D/{x;p;x;p}' data
    Das bedarf, glaube ich, einer kleinen Erklärung:
    Wenn eine Zeile mit einer Ziffer beginnt, dann kopiert sed diese Zeile (den "pattern space") in einen separaten Puffer ("hold space"). Beginnt eine Zeile mit einem "D", dann werden nacheinander folgende Aktionen ausgeführt:
    - der Inhalt des pattern space (die aktuelle Zeile) und des hold space (die letzte Zeile, die mit einer Ziffer begann) werden ausgetauscht
    - der Inhalt des pattern space (ist jetzt die letzte mit Ziffer beginnende Zeile) wird ausgegeben
    - jetzt werden die beiden Puffer wieder ausgetauscht
    - im pattern space steht wieder die aktuelle Zeile, diese wird jetzt auch ausgegeben
    Geändert von jan61 (03-04-2009 um 19:57 Uhr)

  5. #20
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Hi Jan,

    danke, da hätte ich echt mal selber drauf kommen können.
    Ich habe es jetzt so gemacht
    Code:
    NF==5 {ln=$0;}
    NF==37 {print ln,$0}
    Noch eine kleine Verständnissfrage
    Was ist der unterschied zwsichen
    Code:
    {print ln,$0}
    und
    Code:
    {printf "%s\n%s\n",ln,$0;}
    ?

  6. #21
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    Zitat Zitat von swizz Beitrag anzeigen
    Code:
    NF==5 {ln=$0;}
    NF==37 {print ln,$0}
    Das ist aber gefährlich, wenn ich Dein ursprüngliches Problem richtig verstanden habe. Abhängig davon, wie oft pro Zeile Felder zusammengekleistert werden, kann doch die Feldanzahl variieren, oder?

    Zitat Zitat von swizz Beitrag anzeigen
    Noch eine kleine Verständnissfrage
    Was ist der unterschied zwsichen
    Code:
    {print ln,$0}
    und
    Code:
    {printf "%s\n%s\n",ln,$0;}
    ?
    Die erste Variante schreibt die beiden Zeilen als eine Zeile raus, die printf-Variante als 2 Zeilen (es wird ein Zeilenumbruch zwischengesetzt).

    Jan

    P.S.: Ich würde mir auch mal die sed-Variante anschauen. Mit ein paar Änderungen könntest Du dann nämlich die gesamte Verarbeitung in ein einziges sed-Script packen und völlig ohne Pipes o. ä. auskommen.
    Geändert von jan61 (04-04-2009 um 16:24 Uhr)

  7. #22
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Zitat Zitat von jan61 Beitrag anzeigen
    Moin,



    Das ist aber gefährlich, wenn ich Dein ursprüngliches Problem richtig verstanden habe. Abhängig davon, wie oft pro Zeile Felder zusammengekleistert werden, kann doch die Feldanzahl variieren, oder?
    Ne das passt schon, ich habe es vorher schon so bearbeitet, das die Datenzeile immer genau 37 und die Datumszeile immer 5 Felder hat. Ob er den Zeilenumbruch mitnimmt ist für mich auch egal, weil ich es eh noch mit IDL weiterverarbeite.

    Das mit dem Sed lasse ich jetzt. Ich habe jetzt zwei Awk und ein Sed-Skript, die ich über meine Daten laufen lasse, um das Ergebniss zu bekommen, dass ich brauche. Das ist mir kompakt genug.

Lesezeichen

Berechtigungen

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