awk oder sed, textmanipulation

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von morebray, 12.05.2008.

  1. #1 morebray, 12.05.2008
    morebray

    morebray Grünschnabel

    Dabei seit:
    12.05.2008
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo,
    ich versuche in einer Datei, in jeder Zeile, in einer bestimmten Spalte (6 und 10), von einer Zahl (Währung US) die Kommas weg zu bekommen, oder durch

    einen Punkt zu ersetzen.
    Da in der Zeile die Spalten duch Kommas getrennt werden hab ich ein Problem.

    Habe es mit folgenden sed probiert:
    sed 's/\([0-9]*\),\([0-9][0-9]\)/\1.\2/g' Dateiname.csv

    Der Inhalt sieht so aus (vorher):
    PremCurrMst,79890126,8-May-08,S,USD,"-1,250,000.00",1.012412,B,CAD,"1,265,515.00",30-May-08,8129NN00149,CONFIRMED

    Was dann rauskommt, sieht dann so aus (nachher):
    PremCurrMst.79890126,8-May-08,S,USD,"-1.250.000.00",1.012412,B,CAD,"1.265.515.00".30-May-08.8129NN00149,CONFIRMED

    Leider wird hierbei ab der 1. Spalte das Komma auch durch den Punkt ersetzt!?

    Da ja die Zahl (Währung US) in Hochkommas stehen könnte man das ja als Anhaltspunkt nehmen, aber das bekomme ich leider nicht mit dem "awk" oder "sed"

    hin.

    Super wenn mir jemand helfen könnte! ?(


    Grüße
    Volker
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Gott_in_schwarz, 12.05.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Hier mal ein perl oneliner:
    Code:
    perl -anF\" -e '$F[1]=~tr/,/./;$F[3]=~tr/,/./;print join(q{"}, @F)' Dateiname.csv
    Der Input wird in durch Doublequotes separierte Felder getrennt und dann werden in Feld 2 und Feld 4 (die Währungsspalten) jeweils alle Kommata durch Punkte ersetzt. (Wenn das so auch in awk geht, möge man es mir aufzeigen. Aber ich kannte so aus dem Stehgreif kein awk-Äquivalent zu tr///, seds y/// oder gar s///)

    Das funktioniert selbstredend nur, wenn da immer nur exakt 2 double-quotet Strings im Input pro Zeile sind, und diese Strings immer diese US-Dollar Spalten darstellen.

    Wenn du awk (und sed ein wenig) kennst, so sähe das in awk aus:
    Code:
    awk -F'"' '{$2 =~ tr/,/./; $4 =~ tr/,/./; print $0}' Dateiname.csv
    Nur das awk tr wohl nicht kennt. (In sed wäre das y///)
     
  4. #3 Wolfgang, 12.05.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Wenn du es mit sed machen willst:
    Code:
    $ cat test
    PremCurrMst,79890126,8-May-08,S,USD,"-1,250,000.00",1.012412,B,CAD,"1,265,515.00",30-May-08,8129NN00149,CONFIRMED
    
    $ sed -e 's/\([[:digit:]]\{1\}\)\,\([[:digit:]]\{2\}\)/\1.\2/g'  test
    PremCurrMst,79890126,8-May-08,S,USD,"-1.250.000.00",1.012412,B,CAD,"1.265.515.00",30-May-08.8129NN00149,CONFIRMED
    
    
    Gruß Wolfgang
     
  5. #4 morebray, 13.05.2008
    Zuletzt bearbeitet: 13.05.2008
    morebray

    morebray Grünschnabel

    Dabei seit:
    12.05.2008
    Beiträge:
    3
    Zustimmungen:
    0
    wegen: awk oder sed, textmanipulation

    Hallo, vielen Dank für den Input!

    Bin leider nicht der "Guru" wie ihr in diesen Sachen.
    Aber das funktioniert super, bin begeistert!!

    Der Perl oneliner funktioniert super ! (Danke Gott_in_schwarz)

    Der sed oneliner ist auch super, (Danke Wolfgang)
    aber leider wurde nach dem letzten Datum (11. Spalte) das Komma auch in einen Punkt umgesetzt.
    Ich hab schon mal rumprobiert, leider komme ich da nicht weiter.

    viele Grüße
    Volker
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Hi, ich nochmal,

    habe eben meinen Fehler in der Beschreibung gemerkt!

    Es sollen natürlich nur die Kommas entfernt werden in der 6. und 10. Spalte.
    Beispiel: "1,000,000.00" soll als 1000000.00 dargestellt werden, auch die hochkommas sollen da weg.
    Ist doch etwas komlizierter als ich gedacht hatte.

    - Da müsste ich wohl Zwei "perl oder sed" oneliner hintereinander laufen lassen, um erst die Kommas weg zu bekommen und dann noch die Hochkommas-?(

    sorry mein Fehler.

    Grüße
    Volker
     
  6. #5 Gott_in_schwarz, 13.05.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    So?
    Code:
    perl -anF\" -e 'tr/,//d for @F[1, 3];print @F' Dateiname.csv
    Input:
    Code:
    PremCurrMst,79890126,8-May-08,S,USD,"-1,250,000.00",1.012412,B,CAD,"1,265,515.00",30-May-08,8129NN00149,CONFIRMED
    Output:
    Code:
    PremCurrMst,79890126,8-May-08,S,USD,-1250000.00,1.012412,B,CAD,1265515.00,30-May-08,8129NN00149,CONFIRMED
    Änderungen: tr ändert Kommata jetzt nicht in Punkte um, sondern löscht sie. (Nur in den betreffenden Spalten natürlich..) Und das erstelle "Feld-Array" wird diesmal nicht zur Ausgabe mit doublequotes "gejoint" (zusammengefügt), sondern einfach mit Leerstrings. (print @arr)
     
  7. #6 morebray, 14.05.2008
    morebray

    morebray Grünschnabel

    Dabei seit:
    12.05.2008
    Beiträge:
    3
    Zustimmungen:
    0
    1000 Dank, Gott_in_schwarz,
    das funktioniert super !!
    Das hätte ich nicht in Perl hinbekommen.

    viele Grüße
    Volker
     
  8. #7 rubinski, 28.05.2008
    Zuletzt bearbeitet: 28.05.2008
    rubinski

    rubinski Grünschnabel

    Dabei seit:
    28.05.2008
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo, bin neu hier im Board und möchte eine ganz ähnliche Manipulation einer vorhandenen Textdatei vornehmen. Auch bei mir geht es um Spalten im gewissen Sinne. Meine Wunschvorstellung sieht so aus:

    aus einer Textdatei alle Zeilen löschen deren 6. bzw. 9. Spalte (noch besser die 7. und 8. ebenso) identisch sind. Es handelt sich um Zahlenwerte d.h. die Division der beiden (vier) Spalten miteinander muss im Ergebnis also 1 sein.

    Geforscht habe ich bislang nach Sed, AWK, UNIQ.. bislang ohne Erfolg. Bin allerdings ne ziemliche Programmierniete, muss man dazu sagen..

    ERBSEN,BOHNEN,LINSEN,20080526,SUPPE,555,777,444,666,0,0
    ERBSEN,BOHNEN,LINSEN,20080527,SUPPE,555,555,555,555,0,0
    ERBSEN,BOHNEN,LINSEN,20080528,SUPPE,888,999,333,666,0,0


    konkret müsste also im gezeigten Bsp. die zweite Zeile mit dem Datum von gestern gelöscht werden. Bin für jede Hilfe oder jeden brauchbaren Hinweis dankbar!


    Achso, als Nachtrag, falls das von Interesse ist, mein Betriebssystem hier ist Windows XP d.h. ich arbeite mit den CoreUtils in der Version 5.3.0

    http://gnuwin32.sourceforge.net/packages/coreutils.htm
     
  9. #8 rubinski, 29.05.2008
    Zuletzt bearbeitet: 29.05.2008
    rubinski

    rubinski Grünschnabel

    Dabei seit:
    28.05.2008
    Beiträge:
    4
    Zustimmungen:
    0
    Schade dass sich bislang keine Lösung hat finden lassen. Evtl. ist das Problem doch nicht so trivial, wie ich dachte? Oder gar zu trivial? ?(

    An die Moderatoren: wenn ich lieber einen eigenen Thread eröffnen sollte, um meine Chance auf Beantwortung zu steigern, lasst es mich wissen..

    Gruß

    EDIT: so oder ähnlich hatte ich es mir vorgestellt, aber die Syntax stimmt wohl vorne bis hinten nicht..

     
  10. #9 Gott_in_schwarz, 30.05.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Ich fand dein erstes Post ein wenig zu diffus formuliert um darauf zu antworten. Und ja: das Problem ist trivial. Man kann übrigens einfach Zwei Werte direkt auf Gleichheit überprüfen statt zu dividieren und das Ergebnis dann mit 1 zu vergleichen...

    Aber das hier:
    Also erstmal diese verschwurbelte Idee mit der Division und dann: welche Spalten denn jetzt genau? Hier mal ein paar (IHMO) mögliche Permutationen für eine If-Abfrage:
    Code:
    $6 == $9
    #oder:
    ($6 == $9) && ($7 == $8)
    #oder:
    ($6 == $9) && ($6 == $8) && $($6 == $7)
    #oder:
    ($6 == $9) || ($7 == $8)
    Und da hatte ich halt keinen Bock zu raten. Aber da du ja jetzt quasi eine if-Abfrage vorgegeben hast, hier mal'n Fetzen perl:
    Code:
    echo 'ERBSEN,BOHNEN,LINSEN,20080526,SUPPE,555,777,444,666,0,0
    ERBSEN,BOHNEN,LINSEN,20080527,SUPPE,555,555,555,555,0,0
    ERBSEN,BOHNEN,LINSEN,20080528,SUPPE,888,999,333,666,0,0'|
    perl -anF, -e 'print if $F[5] != $F[8]'
    Und [g]awk-Syntax lässt sich btw auch nachlesen/-schlagen:
    *klick mich hart*
     
  11. #10 Wolfgang, 30.05.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Ein Grund, warum z.B. ich persönlich nicht darauf eingehe:
    Diese Kombination hat nichts mit einer Unix Shell zu tun, ist hier sozusagen reichlich OT. Ich kenne weder WinXP noch diese utils. Ich weiß aber aus Erfahrung, daß Lösungsansätze für eine echte Unix/Linux Shell nicht so einfach auf Windows-Notlösungen portierbar sind.

    Ein weiterer Grund ist deine sehr "diffus" beschriebene Aufgabe.

    Dir wird also nur das Studium der Syntax deiner verwendeten Werkzeuge bleiben.

    Wolfgang
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 rubinski, 30.06.2008
    rubinski

    rubinski Grünschnabel

    Dabei seit:
    28.05.2008
    Beiträge:
    4
    Zustimmungen:
    0
    Hallo, da ich in der Zwischenzeit im Urlaub gewesen bin und jetzt zufällig über eure Antworten gestolptert bin - danke dafür - wollte ich allen interessierten meine Lösung nicht vorenthalten, wie ich sie umgesetzt habe:

    gawk -F, "$6!=$9 && $7!=$8 { print }"

    Übrigens ich nutze aus guten Gründen SOWOHL Linux als auch Windows, da unter Linux einfach noch nicht alle meine Bedürfnisse abgedeckt werden konnten. Ich glaube nicht, daß dies eine Schande ist..

    Gruß
     
  14. #12 Wolfgang, 01.07.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Es geht nicht um Schande, sondern, dass du damit hier total OT bist.
    Windowsprobleme werden genau aus diesem Grund hier oft ignoriert. (von mir auf jeden Fall)


    Wolfgang
     
Thema:

awk oder sed, textmanipulation

Die Seite wird geladen...

awk oder sed, textmanipulation - Ähnliche Themen

  1. FTP/FTPS ohne ip_conntrack_ftp oder nf_conntrack_ftp mit iptables

    FTP/FTPS ohne ip_conntrack_ftp oder nf_conntrack_ftp mit iptables: Guten Tag, kennt jemand von euch eine Möglichkeit wie ich vsftpd nutzen kann zusammen mit einer Firewall ohne die im Betreff angegebenen...
  2. HAIKU ?? Oder heißt das ZevenOS?

    HAIKU ?? Oder heißt das ZevenOS?: Hallo, damals hieß es BeOS, dann HAIKU und seit langem ZevenOS? HAIKU war schnell beimhochfahren und runterfahren. Die Optik war interessant....
  3. IT-Systemadministrator/in in Teilzeit oder freiberuflich

    IT-Systemadministrator/in in Teilzeit oder freiberuflich: Wir suchen ab sofort in Teilzeit (20 Std./Woche) oder freiberuflich eine/n IT-Systemadministrator/in. Ihr Aufgabengebiet: Administration,...
  4. Funktionssuche in C: Emacs oder Vim?

    Funktionssuche in C: Emacs oder Vim?: Hallo, ich muss mir häufig C-Projekte angucken, und dann suche ich bspw., wo eine aufgerufene Funkion definiert oder deklariert (Header) wird....
  5. OpenSuse bietet aktuelles KDE mit LEAP oder Tumbleweed

    OpenSuse bietet aktuelles KDE mit LEAP oder Tumbleweed: OpenSuse bietet zwei neue Images an, die die neuesten KDE-Pakete aus den Git-Repositories enthalten. Die Images basieren auf den Varianten Leap...