Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell Probelme 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
anda_skoa
13-06-2002, 08:02
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,
_
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
anda_skoa
13-06-2002, 11:17
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,
_
Nein muss nicht mit sed
werde dein Vorschlag gleich mal testen
<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>
@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
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
ist zwar schon ne zeit her, dass das thema angesprochen wurde, aber für alle die es interessiert wie die ausgabe mit sed geht:
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
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...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.