Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 22

Thema: SED - Frage zu bearbeitung von Messdaten

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219

    SED - Frage zu bearbeitung von Messdaten

    Hallo,

    ich habe eine Messreihe welche Windrichtungen anzeigt.
    Ich habe dabei 36 mit Werten von 0 bis 360 Grad. Das Problem ist, dass der Logger des Messgerätes scheinbar nicht richtig programmiert ist und hin und wieder mal Leerzeichen verschluckt.

    Das sieht dann ungefähr so aus
    Code:
    340.12 356.32182.34 360.12
    Ich müßte es irgendwie schaffen daraus folgendes zu machen.
    Code:
    340.12 356.32 182.34 360.12

    http://www.mrunix.de/forums/showthread.php?t=63206
    Ich hatte esvor einiger Zeit schon mal probiert, allerdings hat die Lösung nur einen Teil meines Problems gelöst.
    sed -e 's/\.[0-9][0-9][0-9][0-9][0-9]/\0 /g'
    So kann ich eine Reihe von 5 Aufeinanderfolgende belibigen Ziffern ersetzen.
    Ich müßte es aber irgendwie schaffen sie wieder durch sich selbst zu ersetzten, nur halt mit Leerzeichen.
    Ich habe schon alle möglichen Versuche wie das hier gestartet und mich durch Tausend Foren und Newsgroupbeiträge geklickt, aber ich kriege es einfach nicht hin.

    sed -e 's/\.[0-9][0-9][0-9][0-9][0-9]/\.[0-9][0-9]\0[0-9][0-9][0-9] /g'
    Falls mir jemand helfen könnte, würde er mich sehr glücklich machen.

    Viele Grüße Malte

  2. #2
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hallo,

    du kannst mit \1 ... \9 auf Teilausdrücke referenzieren, die auf den Suchstring gepasst haben und in Klammern standen.
    Hier mal meine Lösung (ich habe angenommen, dass es immer zwei Nachkommastellen gibt; ist das wirklich so?):
    Code:
    $ echo "340.12 356.32182.34 360.12"|sed -r 's/([0-9]{1,3}\.[0-9][0-9]) ?/\1 /g'
    340.12 356.32 182.34 360.12
    Gruß, Florian
    Ein gebrechlich Wesen ist der X-Server.

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Hallo Florian,

    vielen Dank für deine Hilfe. Das mit den zwei Nachkommastellen ist zwar leider nicht so. Aber es ist auf jeden Fall mal ein Anfang.
    Ich werde das gleich mal ausprobieren.

    Code:
    sed -r 's/([0-9]{1,3}\.[0-9][0-9]) ?/\1 /g'
    Zum Verständniss, damit ich da selber noch ein bisschen dran rumbasteln kann.
    Du ersetzt ganz SED-klassich "([0-9]{1,3}\.[0-9][0-9] ?" durch "\1", richtig soweit?

    "\1" enhält dabei den Ausdruck in der Klammer?

    Ersetzt er dann nicht eigentlich den Ausdruck der "\1" zugeordnet worden ist mit "\"

    "[0-9]{1,3}" interpretiert SED als 3 aufeinander folgende Ziffern?
    Was genaue bedeutet "\.[0-9][0-9]) ?/" in der SED-Syntax?

    Viele Grüße Malte

  4. #4
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Zitat Zitat von swizz Beitrag anzeigen
    Hallo Florian,

    vielen Dank für deine Hilfe. Das mit den zwei Nachkommastellen ist zwar leider nicht so. Aber es ist auf jeden Fall mal ein Anfang.
    Ich werde das gleich mal ausprobieren.
    Okay, dann wird es vermutlich etwas komplizierter, zumindest wird der sed-Ausdruck etwas länger. Da muss ich erstmal ein bisschen drüber nachdenken.

    EDIT: also wenn hinterm Komma auch nur eine Ziffer stehen kann, dann gibt es ein Problem: wie soll z.B. der Fall
    Code:
    123.34 23.251.22 55.33
    behandelt werden? Sind es 23.25 und 1.22 Grad oder 23.2 und 51.22 Grad?

    Code:
    sed -r 's/([0-9]{1,3}\.[0-9][0-9]) ?/\1 /g'
    Zum Verständniss, damit ich da selber noch ein bisschen dran rumbasteln kann.
    Du ersetzt ganz SED-klassich "([0-9]{1,3}\.[0-9][0-9]) ?" durch "\1", richtig soweit?
    Genau, der String, auf den Ausdruck gepasst hat, wird durch das ersetzt, was durch den Ausdruck in der Klammer beschrieben wird.

    "\1" enhält dabei den Ausdruck in der Klammer?
    Ja.

    Ersetzt er dann nicht eigentlich den Ausdruck der "\1" zugeordnet worden ist mit "\"
    Nein, wieso sollte er? Das verstehe ich nicht ganz?

    "[0-9]{1,3}" interpretiert SED als 3 aufeinander folgende Ziffern?
    Es können drei aufeinanderfolgende Ziffern sein, aber auch nur eine Ziffer oder zwei Ziffern.
    Was genaue bedeutet "\.[0-9][0-9]) ?/" in der SED-Syntax?
    Also die Klammer gruppiert Ausdrücke. Das "\." meint einen Punkt, weil "." normalerweise für jedes beliebige Zeichen steht (deshalb wurde er mit dem \ escaped). [0-9] ist eine Ziffer von 0-9 und " ?" sagt: es darf maximal ein Leerzeichen stehen (aber auch gar keines).

    Ich empfehle dir, erstmal die Manpage von sed zu lesen und dann nochmal auf http://de.wikipedia.org/wiki/Regexp zu schauen.
    Geändert von ContainerDriver (31-03-2009 um 11:56 Uhr)
    Ein gebrechlich Wesen ist der X-Server.

  5. #5
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    [QUOTE=ContainerDriver;290352]Okay, dann wird es vermutlich etwas komplizierter, zumindest wird der sed-Ausdruck etwas länger. Da muss ich erstmal ein bisschen drüber nachdenken.

    EDIT: also wenn hinterm Komma auch nur eine Ziffer stehen kann, dann gibt es ein Problem: wie soll z.B. der Fall
    Code:
    123.34 23.251.22 55.33
    behandelt werden? Sind es 23.25 und 1.22 Grad oder 23.2 und 51.22 Grad?
    [QUOTE]

    Damit hast du sehr schön mein Hauptproblem getroffen. Leider werde ich die Daten nicht perfekt hinkriegen, aber ich möchte retten was zu retten ist.

    Weiter Frage ich habe mal versucht deine Lösung auszuprobieren.

    sed (-r) 's/([0-9]{1,3}\.[0-9][0-9]) ?/\1 /g' ../../daten/raw_data/wtr/wtr_hw_d_c_raw_3.ssv > ../../daten/raw_data/wtr/wtr_hw_d_c_raw_4.ssv
    Ich kriege dann die Fehlermeldungsed: illegal option -- r
    sed: illegal option -- r
    usage: sed script [-Ealn] [-i extension] [file ...]
    sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
    oder wenn ich das r weglasse
    sed: 1: "s/([0-9]{1,3}\.[0-9][0- ...": \1 not defined in the RE

  6. #6
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Was ist das denn für eine sed-Version und auf welchem Betriebssystem? Kannst du mal statt dem -r ein -E probieren, bzw. die Klammern und das ? escapen, also:
    Code:
    sed 's/\([0-9]\{1,3\}\.[0-9][0-9]\) \?/\1 /g' ../../daten/raw_data/wtr/wtr_hw_d_c_raw_3.ssv > ../../daten/raw_data/wtr/wtr_hw_d_c_raw_4.ssv
    Ein gebrechlich Wesen ist der X-Server.

  7. #7
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Wenn ich eine -e eingeben kriege ich das hier

    sed: 1: "s/([0-9]{1,3}\.[0-9][0- ...": \1 not defined in the RE
    Betriebssystem ist ein MacOS. Die SED-Version ist die , die in MacOS mit drin ist, allerdings weiß ich nicht genau wie ich rausfinde, was das für einer Version ist.

  8. #8
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hast du -e oder -E probiert? Geht die Version aus Posting #6, bzw. die hier:
    Code:
    sed 's/\([0-9]\{1,3\}\.[0-9][0-9]\) \{0,1\}/\1 /g' ../../daten/raw_data/wtr/wtr_hw_d_c_raw_3.ssv > ../../daten/raw_data/wtr/wtr_hw_d_c_raw_4.ssv
    Geändert von ContainerDriver (31-03-2009 um 16:29 Uhr)
    Ein gebrechlich Wesen ist der X-Server.

  9. #9
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Ich hatte -e probiert. Ich habe es gerade noch mal mit -E gemacht, da läuft er auf jeden Fall ohne Fehlermeldung.

    Vielen Dank für deine Hilfe. Ich werde mal schauen was die Ergebnisse so taugen.

    P.s. stimmst du mir zu, dass bei Einträgen wie 234.5234.34 die beiden Werte nicht eindeutig definiert sind? Ich habe noch ein Programm dass ectra für den Datensatz geschrieben wurde und das läd ihn Problemlos und merkt nicht an, das irgendwas nicht stimm.

  10. #10
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Vielleicht ist da noch irgendwo ein nicht sichtbares Steuerzeichen? Kannst du die Datei mit den Messwerten vielleicht mal zur Verfügung stellen?
    Ein gebrechlich Wesen ist der X-Server.

  11. #11
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Das mit dem Steuerzeichen kann eigentlich eher nicht sein, das sind ganz normale Textfiles. Falls mal eins da war, ist es mittelweile vermutlich auch verschwunden. Was du geerde siehst ist da letzte Punkte an dem ich nicht mehr weiter komme ich habe davor schon massig Korrekturen gemacht. Ich schaue heute abend mal nach, der ursprüngliche Datensatz ist allerdings ein paar GB groß, da da noch ne Menge andere Kram drinstand.

  12. #12
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Warum so aufwendig?
    Du willst nur die Leerzeichen wieder Herstellen - oder nicht?
    Ich würde hier wie folgt vorgehen.
    Suche NICHT Leerzeichen vor 3 Zahlen und einem Punkt => füge ein.
    Code:
    echo "340.12 356.32182.34 360.12
    340.12 356.32 182.34 360.12
    340.12 356.32182.34 360.12
    340.12 356.3218 2.34 360.12
    340.12 356.32 182.34 360.12
    340.12 356.32 182.34 360.12
    340.12 356.32182.34 360.12
    340.12 356.32182.34 360.12
    340.12 356.321 82.34 360.12
    340.12 356.32182.34 360.12
    " > /tmp/test.txt
    
    perl -pi -e 's,(\S)([0-9]{3}\.)+,$1 $2,g' /tmp/test.txt
    
    cat /tmp/test.txt
    Edit: Die Regexp'e die oben verwendet sind viel zu gierig.
    Geändert von undefined (31-03-2009 um 18:49 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  13. #13
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Zitat Zitat von undefined Beitrag anzeigen
    Edit: Die Regexp'e die oben verwendet sind viel zu gierig.
    Inwiefern?
    Ein gebrechlich Wesen ist der X-Server.

  14. #14
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Weil du alles durchsuchst was Zahl{3}.Zahl{2} ist.
    In meinem wird nur nach <KeinLeerzeichen>Zahl{3}. gesucht.
    Erheblich schneller.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  15. #15
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    219
    Hallo nochmal,

    danke auch für deine Hilfe undefined. Ich habe bisher die Lösung von ContainerDriver ausprobiert. Das funktioniert so weit schon mal ganz gut. Vielen Dank dafür.

    Jetzt hätte ich noch eine weitere Frage. Manchmal habe ich ja Blöcke von 4 Ziffern hinter den Buchstaben. Dabei gibt es zwei Fälle.

    1)

    Code:
    23.3245.34
    Könnte sowohl
    Code:
    23.32 45.34
    als auch
    Code:
    23.3 245.34
    bedeuten


    2)

    Code:
    23.3545.34
    bedeutet eindeutig
    Code:
    23.35 45.34
    weil es keine Windrichtungen übder 360 Grad gibt ist
    Code:
    23.3 545.34
    nicht möglich.

    Ist es irgendwie möglich per SED Bedingung die folgenden 3 Schritte durchzuführen?
    1) Wenn ein Block ".[0-9][0-9][0-9][0-9]." auftritt und die zweite Ziffer über nach dem Punkt < 4 ist, dann soll der gesamte Block inklusive der der Zeichen vor und nach den beiden Punkten bis zu den nächsten Leerzeichen durch den Eintrag "-9999 -9999" ersetzt werden.

    2) Wenn ein Block ".[0-9][0-9][0-9][0-9]." auftritt und die zweite Ziffer über nach dem Punkt > 3 ist, dann soll nach der zweiten Zifferein Leerzeichen eingefügt werden also ".[0-9][0-9] [0-9][0-9]."

    3) Wenn ein Block ".[0-9][0-9][0-9][0-9][0-9]." auftritt, dann soll nach der zweiten Ziffer ein Leerzeichen eingefügt werden also ".[0-9][0-9] [0-9][0-9][0-9]."

    Das wäre die absolute Ideallösung für mich, was man aus diesen Daten noch machen kann. Schritt 3 ist jetzt schon gelöst. Schritt 2 wäre zwar toll aber nicht unbedingt notwendig. Schritt 1 wäre noch recht wichtig wenn der klappen könnte.


    Ist es irgendwie wöglich, dass man in SED als Bedingung einbaut.
    1) Block zwischen den Punkten 4 Stellen und 2 Stelle > 3

Lesezeichen

Berechtigungen

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