Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Shell Probelme mit sed

  1. #1
    Registrierter Benutzer Avatar von Sucht
    Registriert seit
    27.09.2001
    Beiträge
    18

    Shell Probleme mit sed

    folgendes Problem aus einer Datei 3 Wort und 5 wort und 9 wort auslesen und die
    Werte hintereinander durch # getrennt in eine Datei schreiben.

    Wenn ich sed -n -e 3p -e 5p -e 9p datei.txt bekomme ich die Wörter ausgelesen aber eben so

    1.Wort
    2.Wort
    3.Wort

    ich möchte es aber so haben

    1.Wort#2.Wort#3.Wort


    auch wenn ich den sed befehl einzeln in Variablen einlese
    Bsp. var1=$(sed -n 3p datei.txt)
    var2=$(sed -n 5p datei.txt)
    und dann ausgebe mit
    echo $var1#$var2
    wird var1 durch var2 überschrieben

    kann mir jemand helfen
    Geändert von Sucht (13-06-2002 um 09:21 Uhr)
    Tschau Sucht


    Wer lesen kann ist klar im Vorteil !!!

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    probier den Output in zwei echo statements:

    echo -n $var1# >> out.txt
    echo $var2 >> out.txt

    Das -n unterdrückt das newline.

    Eventuell muß man das # escapen, das ist ja das Kommentafzeichen.

    Ciao,
    _

  3. #3
    Registrierter Benutzer Avatar von Sucht
    Registriert seit
    27.09.2001
    Beiträge
    18
    Habe es probiert aber er überschreibt trotzdem
    habe Suse linux 7.1

    wenn ich die Varablen mit anderen Befehlen füttere funktioniert es

    Bsp. $VAR1=(ls -l) $VAR2=(ls)

    Die ausgabe wird ordentlich durchgeführt

    Nur wenn ich eigene Variablen mit dem sed kommando fülle geht es nicht
    Tschau Sucht


    Wer lesen kann ist klar im Vorteil !!!

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Muß es mit sed sein?

    Vielleicht ist da awk leichter
    cat datei.txt | awk '{ print $1#$2#$4; }'

    Sollte das erste, das zweite und das vierte Wort ausgeben.

    Ciao,
    _

  5. #5
    Registrierter Benutzer Avatar von Sucht
    Registriert seit
    27.09.2001
    Beiträge
    18
    Nein muss nicht mit sed

    werde dein Vorschlag gleich mal testen
    Tschau Sucht


    Wer lesen kann ist klar im Vorteil !!!

  6. #6
    Registrierter Benutzer
    Registriert seit
    16.04.2002
    Beiträge
    20
    <pre>
    hai sucher,

    leider ist mir dein problem nicht ganz klar.
    wie sieht den vorallem deine eingabe aus und
    was genau soll dann dabei als ergebins erscheinen.

    inkompatibel zueinander sind z.b. die bisher
    genannten kommandos:
    sed -n -e 3p -e 5p -e 9p <datei>
    (liest zeilenweise jede 3.,5.,9. zeile)
    und
    awk '{ print $1#$2#$4; }' <datei>
    (liest 1.,2.,4. wort aus JEDER zeile)


    ich gehe mal vonfolgenen szenarios aus:

    eingabedatei fuer wortweise:
    ----------------------------
    <datei>
    1111 2222 3333 4444 5555 6666 7777 8888 9999 0000

    eingabedatei fuer zeilenweise:
    ------------------------------
    <datei>
    1111
    2222
    3333
    4444
    5555
    6666
    7777
    8888
    9999
    0000

    wortweise mit awk:
    ------------------
    awk '{ print $3 "#" $5 "#" $9 } ' <datei>

    wortweise mit shell:
    --------------------
    while read line
    do
    set - $line
    echo "${3}#${5}#${9}"
    done < <datei>

    zeilenweise mit awk:
    --------------------
    # $0 gibt die ganze zeile aus
    # NR zaehlt die eingabe zeilen
    awk 'NR == 3 { printf "%s#", $0 }
    NR == 5 { printf "%s#", $0 }
    NR == 9 { printf "%s\n", $0 }' <datei>

    zeilenweise mit shell:
    ----------------------
    typeset -i i=1:
    while read line
    do
    case $i in
    3) echo -n "${line}#" ;;
    5) echo -n "${line}#" ;;
    9) echo "${line}" ;;
    esac
    i=i+1
    done < <datei>

    das ist natürlich alles noch in recht simpler
    und sehr starrer form.
    eine lösung mit sed ersparte ich mir jetzt mal,
    aufgrund der komplexität.

    viele grüsse
    lankin
    </pre>

  7. #7
    Registrierter Benutzer Avatar von Sucht
    Registriert seit
    27.09.2001
    Beiträge
    18

    @lankin

    @lankin

    mein Problem ist das ich aus einer ASCI datei das 1. 3 9. Wort auslesen muss und es in einer anderen Datei im Format

    1.wort#3wort#9.wort wieder abspeichern will

    wenn ich das script mit sed ausführe werden die einglesenen Wörter aber untereinander geschrieben.
    also habe ich für jedes wort eine eigene anweisung mit sed geschrieben und sie jeweils einer Variable übergeben bei der Ausgabe mit echo $var1#$var2 usw. überschreibt die 2. Variable die erste

    ich brauche nur bestimmte werte aus der einzulesenden Datei und muss sie in das
    Format 1.Wort#2.word#

    also die eingelesenen Wörter hintereinander mit # als Trenner
    Tschau Sucht


    Wer lesen kann ist klar im Vorteil !!!

  8. #8
    Registrierter Benutzer
    Registriert seit
    16.04.2002
    Beiträge
    20
    hai sucher,

    hmm, okay, wer bloede fragt....
    du hast also ein file mit einem wort pro zeile ?
    wegen dem "sed -p", dieser befehlt gibt ja die
    ganze zeile aus ?!
    aber die passende alternative zum sed kannst
    du ja an meinen beschrieben beispielen sehen.

    > auch wenn ich den sed befehl einzeln in Variablen einlese
    > Bsp. var1=$(sed -n 3p datei.txt)
    > var2=$(sed -n 5p datei.txt)
    > und dann ausgebe mit
    > echo $var1#$var2
    > wird var1 durch var2 überschrieben

    also willst du doch den sed ?!
    nun dann musst du die variablen _sauber_
    zuweisen.

    der fehler: die "#" wegen der internen
    variablen-aufloesung der shell, dazu kommen
    noch die fehlenden quotes und die fehlenden
    klammern.

    deine ausgabe zeile 'echo $var1#$var2'
    sollte korrekt so aussehen:
    'echo "${var1}#${var2}'

    einfacher geht's aber mit den beschriebenen awk's.


    ciao lankin

  9. #9
    Registrierter Benutzer
    Registriert seit
    17.11.2010
    Beiträge
    57
    ist zwar schon ne zeit her, dass das thema angesprochen wurde, aber für alle die es interessiert wie die ausgabe mit sed geht:

    Code:
    hoehe=$(sed -ne '1,0p' datei.txt) //nur die erste Zeile
    breite=$(sed -ne '2,0p' test1.txt) //nur die 2te Zeile
    
    echo "Hoehe, $hoehe"
    echo "Breite, $breite"
    LG

  10. #10
    Registrierter Benutzer Avatar von John W
    Registriert seit
    29.01.2010
    Beiträge
    211
    Kann ihn mal jemand verhaften? Leichenschänder!
    (wie kommt man eigentlich auf den Gedanken, dass jemand sich nach 8 Jahren noch für die Lösung interessiert?)
    EDIT: Ach so, haben wir eigentlich eine Schaufel aus Platin? Ich mein, Gold tut's da ja wohl nicht mehr...
    Geändert von John W (02-12-2010 um 15:52 Uhr)

Lesezeichen

Berechtigungen

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