batch skript

AMD_Rulez

Lieutenant
Dabei seit
Feb. 2010
Beiträge
582
hallo

ich möchte mit einem batch skript daten aus einer datei filtern und einzeln ausgeben.
die datei sieht ca. so aus:
Code:
Zahl:eins;zwei;drei;vier

das skript soll am ende folgendes ausgeben:
Code:
eins
zwei
drei
vier

so sieht es bis jetzt aus doch es funktioniert nicht:
i=1
while [ $zahl -ne "" ]
do
zahl=`grep 'Zahl:' /Pfad/zur/datei | cut -f $i -d ";"`
echo $zahl
i=$(( $i + 1 ))
done


was habe ich falsch gemacht?
 
Hi,

frage: weisst du die Anzahl der Elemente oder nicht? In welcher Umgebung machst du das Ganze? Das "grep" sieht nach Unix / Linux aus, ist das richtig?

Bei einer DOS-Umgebung hätte ich einen Ansatz, falls dir die Anzahl der Elemente bekannt ist.

Was passiert denn bei deiner Lösung? Habe gerade keine Linux-VM zur Hand.

VG,
Mad
 
ja das ganze passiert unter linux als shell skript.

die anzahl der elemente ist unbekannt, sprich sie kann variieren.

ich bekomme folgende fehlermeldung wenn ich das slript ausführe:
Code:
 line 7: [: !=: unary operator expected


laut internet kann man für ungleich wohl "-ne" oder "!=" verwenden aber beides funzt nicht.
 
Zuletzt bearbeitet:
Meine Datei sieht so aus

Code:
Zahl:eins;zwei;drei;vier
Zahl:fuenf;sex;sieben;acht;neun

und ein

Code:
cat datei | perl -e 'while(<>){ print join("\n", /[;:](\w+)/gs),"\n"; }'

liefert

Code:
eins
zwei
drei
vier
fuenf
sex
sieben
acht
neun


HTH

BigNum
 
lässt sich das nicht auch mit einem reinen bash skript lösen? das fände ich besser
 
Bitte sehr der Herr:

Code:
cut -d':' -f2 datei | cut -d';' -f-99 --output-delimiter=$'\n'

Zitat von AMD_Rulez:
lässt sich das nicht auch mit einem reinen bash skript lösen? das fände ich besser
Weil "perl" ein böses Kommando und Hexenwerk (oder vielleicht sogar "Nineties") ist?
Jede (vernünftige) Linux-Distro hat aus gutem Grund perl installiert ;)

:schluck: Prost!

BigNum
 
nein.
1. weil ich keine ahnung von perl habe.
2. weil ich nur genau die zeile die mit "Zahl:" anfängt bearbeiten möchte.
3. weil das perl skript am ende zwei leerzeilen mit ausgibt, die nicht vorhanden sein dürfen.
Ergänzung ()

trotzdem vielen dank für die hilfe:)

habe dabei aber ein weiteres problem. die werte also (eins;zwei;...) müssen in einer variable gespeichert werden, da sie einzeln weiterverarbeitet werden müssen.

ich habe vor das ganze ein grep gemacht weil die datei mit den dateen mehrere zeilen enthällt.
und anschließend das ganze in einer variablen gespeichert. weiter komme ich aber nicht, weil die variable ja nur als ganzes ausgegeben werden kann. das sieht auf der kommandozeile so aus:
Code:
eins zwei drei vier funf sechs sieben acht neun

hier das skript:

Code:
zahl=`grep 'Zahl' /pfad/zur/datei | cut -d':' -f2 | cut -d';' -f-99 --output-delimiter=$'\n'`

echo $zahl
Ergänzung ()

das ganze müsste also eigentlich eine schleife durchlaufen für die anzahl der werte, da diese variieren können, und anschließend den neuen wert in eine variable speichern.
 
Ich fürchte meine Frotzeleien hören sich für Dich schlimmer an als sie gemeint sind ;)

Zitat von AMD_Rulez:

Das war für mich immer ein Ansporn Neues hinzuzulernen. Vielleicht kann ich Dir einen kleinen Anstoss hierzu geben...

Zitat von AMD_Rulez:
2. weil ich nur genau die zeile die mit "Zahl:" anfängt bearbeiten möchte.

Kein Problem, ist nur eine kleine Änderung im Perl-Script.

Zitat von AMD_Rulez:
3. weil das perl skript am ende zwei leerzeilen mit ausgibt, die nicht vorhanden sein dürfen.

Kein Problem, ist nur eine kleine Änderung im Perl-Script.

Zitat von AMD_Rulez:
Ergänzung ()

trotzdem vielen dank für die hilfe:)

Wie Du ja an meinen (ständigen) Antworten sehen kannst bin ich Dir wohlgesonnen ;)

Zitat von AMD_Rulez:
habe dabei aber ein weiteres problem. die werte also (eins;zwei;...) müssen in einer variable gespeichert werden, da sie einzeln weiterverarbeitet werden müssen.

ich habe vor das ganze ein grep gemacht weil die datei mit den dateen mehrere zeilen enthällt.

Das habe ich mir schon gedacht ;)

Zitat von AMD_Rulez:
und anschließend das ganze in einer variablen gespeichert. weiter komme ich aber nicht, weil die variable ja nur als ganzes ausgegeben werden kann. das sieht auf der kommandozeile so aus:
Code:
eins zwei drei vier funf sechs sieben acht neun
Ergänzung ()

das ganze müsste also eigentlich eine schleife durchlaufen für die anzahl der werte, da diese variieren können, und anschließend den neuen wert in eine variable speichern.

Richtiger Gedanke! Es gibt in der bash auch eine "for"-Schleife: Sieh Dir mal das an:
Code:
#!/bin/bash

for i in `cut -d':' -f2 datei | cut -d';' -f-99 --output-delimiter=$'\n'`
do
echo $i
done
und ersetze "echo $i" durch Deine nötigen Bearbeitungsschritte (die auch über mehrere Zeilen gehen können) ;)


HTH

BigNum
 
auf die idee mit der for schleife bin ich auch schon gekommen aber dabei gibt es ein problem.
wenn ich das skript wie von dir geschrieben so ausführe bekomme ich zwar (eins,zwei,drei... usw) unter einander ausgegeben aber auch weiteres aus der datei. mit grep komme ich da auch nicht weiter weil die daten (also in dem bespiel eins;zwei;drei...) variable vom inhalt und von der anzahl sein können...
Ergänzung ()

okay kleiner denkfehler von mir:D

so siehts jetzt aus und funktioniert wunderbar:
Code:
for i in `grep 'Zahl:' /Pfad/zur/Datei | cut -d':' -f2 | cut -d';' -f-99 --output-delimiter=$'\n'`
do
echo $i
done

bei "echo $i" wie von dir gesagt habe ich jetzt garnichts geändert.

funktioniert super. danke für die ausführliche hilfe.:)
 
Zitat von AMD_Rulez:
so siehts jetzt aus und funktioniert wunderbar:
Code:
for i in `grep 'Zahl:' /Pfad/zur/Datei | cut -d':' -f2 | cut -d';' -f-99 --output-delimiter=$'\n'`
do
echo $i
done

bei "echo $i" wie von dir gesagt habe ich jetzt garnichts geändert.

funktioniert super. danke für die ausführliche hilfe.:)
You're welcome!

Aber ich dachte Du wolltest die Werte noch weiterverarbeiten?
Zitat von AMD_Rulez:
habe dabei aber ein weiteres problem. die werte also (eins;zwei;...) müssen in einer variable gespeichert werden, da sie einzeln weiterverarbeitet werden müssen.
Darum meinte ich ja auch "und ersetze "echo $i" durch Deine nötigen Bearbeitungsschritte"...


Grüße

BigNum
 
darum hab ich mich schon gekümmert:p das ganze war nur ein kleiner teil von einem projekt, das ich jetzt endlich fertig stellen konnte:freak:
 
Zurück
Top