sed spaltenweise bearbeiten ohne awk?

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Chib, 31.05.2007.

  1. Chib

    Chib Jungspund

    Dabei seit:
    31.05.2007
    Beiträge:
    14
    Zustimmungen:
    0
    Folgendes Problem: Ich habe eine Tabelle, welches in mehreren Spalten unterteilt ist (spaltentrennzeichen ist ein Pipezeichen "|"). In der 8. und 9. Spalten sine jeweils nur Nummer vorhanden. Ich will jetzt dass diese Nummer durch "Bezeichnungen" ersetzt werden (z.b 1=high, 2=middle, 3=low). Das Problem ist nun, dass in den beiden Spalten die Bezeichnungen anders sind -> d.h: in der 8.Spalte heisst Zahl 1 = High und in der 9.Spalte die Zahl 1 = Minor. Ich kann hier also kein sed global substitute machen.
    Es ist auch nicht möglich von vorne die Anzahl Stellen zählen bis zur 8. und 9.Spalten und dann ein sed befehl einzusetzen, da sie von Zeile zu Zeile anders ist.
    Ist es eigentlich nun möglich im sed statt zeilenweise vorzugehen, spaltenweise vorzugehen?
     
  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. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Spontan:
    Code:
    sed 's/\(|.*|.*|.*|\)1\(|.*|.*|\)/\1high\2/g'
    
    macht aus
    Code:
    |1|2|1|2|1|2|1|
    
    Code:
    |1|2|1|2|high|2|1|
    
    Gibt bestimmt elegantere Lösungen...
    Gruss
    d22
     
  4. b00

    b00 Haudegen

    Dabei seit:
    28.03.2007
    Beiträge:
    597
    Zustimmungen:
    0
    Ort:
    /root
    woher weisst du ob 1= high oder minor werden soll?
    gibt es da irgentein identifyer?
     
  5. Chib

    Chib Jungspund

    Dabei seit:
    31.05.2007
    Beiträge:
    14
    Zustimmungen:
    0
    das habe ich oben vergssen zu erwähnen.... in der 8.spalte soll es folgendes aussehen:

    1=highest
    2=high
    3=normal
    4=low

    und der 9.spalte soll es so aussehen:

    1=major
    2=normal
    3=minor
     
  6. #5 Fallout, 31.05.2007
    Zuletzt bearbeitet: 31.05.2007
    Fallout

    Fallout Doppel-As

    Dabei seit:
    02.03.2007
    Beiträge:
    120
    Zustimmungen:
    0
    Hi,

    mit sed in einer bestimmten Spalte mehrere Möglichkeiten zu supstitutionieren erscheint mir sehr schwierig bzw. absolut umständlich.
    In awk eigentlich genauso - die gensub-Funktion hilft hier vielleicht ein wenig, aber spätestens bei der Ersetzung mehrerer Möglichkeiten wird es hier zu umständlich.

    Da würde ich eher noch auf die gute alte while-read-Methode zurückgreifen:
    Code:
    #!/bin/bash
    inputfile=$1
    if [ ! -r "$inputfile" ]; then echo "Quelldatei nicht lesbar/existent!"; exit 1; fi
    oldIFS=$IFS
    IFS=\|
    while read s1 s2 s3 s4 s5 s6 s7 s8 s9 rest; do
     case "$s8" in
      1) s8="highest";;
      2) s8="high";;
      3) s8="normal";;
      4) s8="low";;
     esac
     case "$s9" in
      1) s9="major";;
      2) s9="normal";;
      3) s9="minor";;
     esac
    echo "$s1|$s2|$s3|$s4|$s5|$s6|$s7|$s8|$s9|$rest"
    done < "$inputfile"
    IFS=$oldIFS
    Gruß Daniel
     
  7. #6 Chib, 31.05.2007
    Zuletzt bearbeitet: 31.05.2007
    Chib

    Chib Jungspund

    Dabei seit:
    31.05.2007
    Beiträge:
    14
    Zustimmungen:
    0
    @fallout: bei deinem script zeigt er mir zwar keine fehler an aber er ändert auch nichts...
     
  8. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Rufst Du es auch mit dem Dateinamen als erstem Argument auf? Kannst Du ansonsten mal ein paar Zeilen aus der Datei senden?
     
  9. #8 Fallout, 01.06.2007
    Fallout

    Fallout Doppel-As

    Dabei seit:
    02.03.2007
    Beiträge:
    120
    Zustimmungen:
    0
    Hm, kurzer Test (unter GNU bash, version 3.1.17(1)-release):

    Scheint soweit wie gewollt zu funktionieren. Ist vielleicht mal wieder eine Kompatibilitätsfrage - welche Shell verwendest Du?
    Wenn dies bei Dir nichts verändert, liegt es vermutlich an einer fehlerhaften Trennung der Segmente durch das Pipe-Zeichen.
    Versuche evtl. auch mal, den IFS mit IFS='|' zu setzen - vielleicht mag Deine Shell die Entwertung mit dem Backslash nicht.

    Ggf. werden die case-Auswertungen auch nicht richtig als Strings interpretiert. Wandle diese mal in "1") s8="highest";; usw. um.

    Gruß Daniel
     
  10. #9 Chib, 01.06.2007
    Zuletzt bearbeitet: 01.06.2007
    Chib

    Chib Jungspund

    Dabei seit:
    31.05.2007
    Beiträge:
    14
    Zustimmungen:
    0
    nun ich verwende die Bash-shell 2.05 -> ich update es mal auf die neuste Verison und schaue dann wie es funktioniert

    Edit: wenn ich denn script laufen lasse erscheint nur folgendens:

     
  11. Chib

    Chib Jungspund

    Dabei seit:
    31.05.2007
    Beiträge:
    14
    Zustimmungen:
    0
    jo hier:

    also nun sollte die 8 (zahl 3 im Beispiel) und 9 (zahl 1 im Beispiel) Spalte geändert werden wie oben beschrieben

    ps: sry für doppelpost :O
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 Fallout, 06.06.2007
    Zuletzt bearbeitet: 06.06.2007
    Fallout

    Fallout Doppel-As

    Dabei seit:
    02.03.2007
    Beiträge:
    120
    Zustimmungen:
    0
    Hi,

    Die zu ändernden Werte müssen für das genannte Skript schon eindeutig definiert sein.
    Da das Pipe den Feldtrenner darstellt, werden Blanks natürlich mit in die zerlegten Strings gepackt. Dadurch schlägt der Vergleich dieses Wertes " 3" mit der Referenz "3" fehl.
    Du kannst für den case-Vergleichsstring auch mehrere Alternativen angeben:
    Code:
     case $variable in "3"|" 3"|"3 ") echo "Treffer";; esac
    Mir ist leider nur nicht bekannt, daß case auch volle reguläre Ausdrücke unterstützt, sondern nur die Pfadnamenerweiterung (siehe man bash -> Pathname Expansion), welche nicht besonders felxibel ist.
    Du könntest auch
    Code:
     case $variable in *3*) echo "Treffer";; esac
    einsetzen, wodurch jedoch sämtliche Spalten die irgendwo eine 3 enthalten geändert würden.

    Edit:

    Noch eine Alternative: Du kannst den zu vergleichenden String vor der Übergabe an case auch verändern/zurechtstutzen:
    Code:
    case $(echo "$variable" | sed 's/ //g') in 3) echo "Treffer";; esac
    Dadurch wird der String nicht in seinem ursprünglichen Zustand an case übergeben, sondern vorher bearbeitet indem mit Hilfe von sed alle Blanks entfernt werden.

    Gruß Daniel
     
  14. #12 Schlaubi_fi.de, 06.06.2007
    Schlaubi_fi.de

    Schlaubi_fi.de Mac OS X User

    Dabei seit:
    22.12.2004
    Beiträge:
    304
    Zustimmungen:
    0
    Mir auch nicht, aber man könnte das Ganze trotzdem meiner Meinung nach noch etwas verfeinern und zwar mit expr:
    Code:
    schlaubi:~ schlaubi$ var=" "; [b]variable="3"[/b]; case $variable in *3*) var="$(expr "$variable" : '^[0-9]$')" && echo "Treffer" || { echo "Wert '$variable' nicht eindeutig."; } ;; esac;
    Treffer
    schlaubi:~ schlaubi$ var=" "; [b]variable=" 3"[/b]; case $variable in *3*) var="$(expr "$variable" : '^[0-9]$')" && echo "Treffer" || { echo "Wert '$variable' nicht eindeutig."; } ;; esac;
    Wert ' 3' nicht eindeutig.
    
     
Thema:

sed spaltenweise bearbeiten ohne awk?

Die Seite wird geladen...

sed spaltenweise bearbeiten ohne awk? - Ähnliche Themen

  1. Spaltenweise Zeichen hinzufügen (sed? / awk?)

    Spaltenweise Zeichen hinzufügen (sed? / awk?): Hallo, kann mir bitte jemand bei folgendem Fall helfen: Habe eine Datei mit mehreren Spalten in denen beliebige Zahlenwerte stehen. Jetzt...
  2. *.txt zeilen+spaltenweise auslesen

    *.txt zeilen+spaltenweise auslesen: Hallo alle Zusammen! Ich hab eine Text-Datei vorliegen mit folgendem Inhalt: Zahl1,1; Zahl1,2; Zahl1,3; Zahl1,4 Zahl2,1; Zahl2,2; Zahl2,3;...
  3. Datei zeilenweise und spaltenweise auslesen

    Datei zeilenweise und spaltenweise auslesen: Hi, ich habe folgendes Problem. Möchte gerne eine Datei zeilenweise auslesen und dabei jede Zeile in zwei Spalten aufteilen. Mache ich das...
  4. Txt Inhalt bearbeiten/ergänzen

    Txt Inhalt bearbeiten/ergänzen: Hi, ich habe folgendes Problem. In meiner txt habe ich mehrere Links untereinander aufgefuehrt. http://www.link1.de/ordner...
  5. MAKE ? JPG Dateien per Bash Skript bearbeiten

    MAKE ? JPG Dateien per Bash Skript bearbeiten: Moin Gemeinde, kann ich sicherstellen das Dateien in einem Verzeichnis trotz stündlicher Abarbeitung nur einmal bearbeitet werden. Ausnahme Neue...