PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell Probelme mit sed



Sucht
13-06-2002, 06:38
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,
_

Sucht
13-06-2002, 09:21
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,
_

Sucht
13-06-2002, 13:48
Nein muss nicht mit sed

werde dein Vorschlag gleich mal testen

lankin
14-06-2002, 15:07
<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>

Sucht
14-06-2002, 17:15
@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

lankin
17-06-2002, 13:59
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

peyo
01-12-2010, 14:56
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

John W
02-12-2010, 15:49
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...