Das einfachste wäre, wenn Du ein konkretes Beispiel angibst, wie die Datei mit den Ausgangsdaten aussieht sowie wie die Input-Datei aussehen muss.
Gruss, Xanti
hi
jetzt wird es zähfliesend!
ich müße ein für den profi kleines, aber für mcih großes programm schreiben!
wenn mir eine hilf mache ich es unter unix, ansonsten werde ich es mit Fortran (ja ich bin alt) machen denn das kann ich so einigermasen
ich muß eine datei öffnen, dann eine wert auslesen und danach entscheiden
bei "1" muß ich eine kleine datei schriben mit dessen hilfe ich mittesl ftp etwas lösche
dann muß ich die erste datei wieder öffnen und werte auslesen. dazu bräuchte ich noch die dateidaten, uhrzeit, datum und name ohne endung
uas all diesen werten mache ich eine input datei die ich dann in ein labordatensystem (Lims QLS) einlese
wenn mir einer helfen würde wäre das echt prima
er muß wohle nerven aus drahtseilen haben
liebe grüße
Frank müller
|
Das Linux-Firewalls Standardwerk jetzt 71% billiger – Nur solange Vorrat reicht DAS Firewall-Buch jetzt günstiger! Security-Fachmann Ralf Spenneberg führt mit diesem Buch
|
Das einfachste wäre, wenn Du ein konkretes Beispiel angibst, wie die Datei mit den Ausgangsdaten aussieht sowie wie die Input-Datei aussehen muss.
Gruss, Xanti
<@Agnar> heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
Okay
fangen wir mal an!
ich habe eine datei, dess namen steht in einer varaibeln drin!
z.b. so: c:/qls/qls/kln/1_105014.fax
zuerst brauche ich das datum die uhrzeit und den dateinamen davon und zwar in eine variable damit ich sie später weiter verarbeiten kann
in der ersten zeile steht eine 0 oder 1
wenn eine null drin steht fliegt sie auf den müll bei einer 1 muß ich weiterlesen
so sieht die datei aus
1
0
0
Betreff 024212222222 Nr 06-00840 , sent
Ich brauche nun noch der wert der 3 zeile
die telefonummer und die nummer 06... und den text hinter dem komma
aus all den daten wir dann folgene datei geschrieben
.DBI 1 FAXREP 1
.KEY "1_105014"
.DDI FAXMES 0 1 "sent"
.DDI FAXTEL 0 1 "024212222222 "
.DDI FAXZK2 0 1 "06-03062"
.DDI FAXDAT 0 1 "13.12.2006"
.DDI FAXZEI 0 1 "15:36"
.DDI FAXERR 0 1 "0"
.DDI FAXSYS 0 1 "TOBIT"
.DDI FAXKUN 0 1 &ZK2 06-03062 KBEZ
.DDI LTIME 0 1 @¹h:²m
die inversen felder sind die inhalte der variablen
so das war nun die einen datei
zusätzlich baruche ich noch eine datei
darim steht im prinzip nur das drin
**********************
user anonymous
delete 1_105014.$$$ <- dateiname aber mit dem $$$ am ende
quit
********************************
damit lösche ich dann die datei mittel FTP
ich hoffe ich hab alles
vorerst viele dank
Ok, mit perl wäre es eleganter und effizienter, da da nicht für jede Variable das File komplett geparst werden muss. Bei 4 Zeilen fällt das aber nicht ins Gewicht.
Die Variable, die den Filenamen enthält, heisst $file. Ausgabe ist in zwei Dateien $KEY.input und $KEY.ftp.Code:#!/bin/bash if [ $(sed -n '1p' "$file") = "1" ]; then KEY=${file%\.fax} FAXDAT=$(stat -c "%z" "$file" | sed 's/^\(\w*\)-\(\w*\)-\(\w*\).*/\3.\2.\1/') FAXERR=$(sed -n '3p' "$file") FAXKUN=$(sed -n '4s/.*Nr \([0-9\-]*\).*/\1/p' "$file") FAXMES=$(sed -n '4s/.* \(\w*\)$/\1/p' "$file") FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file") FAXZEI=$(stat -c "%z" "$file" | sed -n 's/.* \(\w*:\w*\):.*/\1/p') cat << EOF > "$KEY.input" .DBI 1 FAXREP 1 .KEY "$KEY" .DDI FAXMES 0 1 "$FAXMES" .DDI FAXTEL 0 1 "$FAXTEL" .DDI FAXZK2 0 1 "$FAXKUN" .DDI FAXDAT 0 1 "$FAXDAT" .DDI FAXZEI 0 1 "$FAXZEI" .DDI FAXERR 0 1 "$FAXERR" .DDI FAXSYS 0 1 "TOBIT" .DDI FAXKUN 0 1 &ZK2 $FAXKUN KBEZ .DDI LTIME 0 1 @¹h:²m EOF cat << EOF > "$KEY.ftp" ********************** user anonymous delete $KEY.\$\$\$ quit ******************************** EOF fi
Gruss, Xanti
Geändert von Xanti (14.12.2006 um 15:25 Uhr)
<@Agnar> heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
hupsss
das ging aber fix
ich probier es mal aus!
ähmmm
wo nimmst du die zeit nur her ?
du solltest dich bei unsere firma bewerben!
also nochmal
du machst das einfach prima
ich arbeite mitlerweile seit 16 jahren in der it
programiere immer wieder unter fortan und kenn sogar noch richtig betriebsysteme wie VMS
aber ich finde ganz toll wie du das alles so aus deinem gehirn kramst
ich versuche immer wieder die befehel zu analysieren
aber es ist recht schwirig
unter vms heißen diese skripte prozeduren und das kann ich gut
aber unix erstaunt mich immer wieder
hmmmm
hackt noch
auf der shell kommt folgene meldung!
qco/david_log3 29: <<EOF unclosed
ich hab auch den eindruck das er nicht in der if schleif reinkommt
ich hab hinter der esten variable eine echo gemacht und das zeigt er nicht
#!/bin/bash
export file='c:/qls/qls/kln/qsp/fax/log/1_111111.fax'
echo $file
if [ $(sed -n '1p' "$file") = "1" ]; then
KEY=${file%\.fax}
echo $key
was ist eigentlich mit der startsequenz : #!/bin/bash
muß die sein?
bei mir fängt das immer so an !:
#!/bin/sh
cd c:/qls/qls/kln
. ./kshrc # hole QLS-Environment
Erstmal muss ich sagen, dass Deine Problemstellung nicht wirklich kompliziert ist und eher eine Fleissaufgabe darstellt, die in einer viertel bis halben Stunde gelöst werden kann.
Unix ist case-sensitiv. Die Variable key ist eine andere als KEY, also muss da "echo $KEY" stehen.Code:if [ $(sed -n '1p' "$file") = "1" ]; then KEY=${file%\.fax} echo $key
Da Du, wie ich irgendwo gelesen habe, eine Unix-like-Umgebung hast, kann es auch gut sein, dass einige Bash-Sachen nicht funktionieren. Probier mal statt
Code:cat << EOF > output zeile 1 zeile 2 ... EOF#!/bin/bash ist die Shebang und legt den Interpreter für das Skript fest. Bei mir ist /bin/sh ein Link auf /bin/bash und damit ist #!/bin/bash gleichwertig mit #!/bin/sh. In einem normalen Mehr-Shell-Unixsystem bekommt man aber Schwierigkeiten damit, wenn man die Shell nicht explizit angibt.Code:(echo zeile 1 echo zeile 2 ) > output
btw, Du hast eine PM.![]()
<@Agnar> heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
ich bin was weiter!
es lag an vielen leerzeichen die ich beim kopieren mit genommen habe
er schreib jetzt eine datei
nur beide in eine
ich such noch was
so jetzt sieht es fast prima aus
in den vars FAXTEL und FAXMES ist nix drin !
warum auch immer
der "stat"befhle meckert er an! auch hier alles leer
in der ausgabe in der datei brauche ich nur den dateinamen ohne Pfad
hier wäre die doku für den befhel "stat" (für die wissenden)
Geändert von muemmi (14.12.2006 um 12:31 Uhr)
hmmmm
merkwürdig
wenn ich den befehl "stat -c datei" ausführe sagt er stat not found
laut doku müßtes es ihn ja geben
könnte man mit ls nicht die info bekommen und dann den string auslesen?
FAXTEL und FAXMES: scheint ein Problem mit dem nicht erkannten blank zu sein. Ich ging davon aus, dass der Trenner ein Leerzeichen ist. Ersetz mal die beiden Zeilen
durchCode:FAXMES=$(sed -n '4s/.* \(\w*\)$/\1/p' "$file") FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file")
Damit werden sowohl Leerzeichen als auch Tabs erschlagen.Code:FAXKUN=$(sed -n '4s/.*Nr[[:blank:]]\([0-9\-]*\).*/\1/p' $file) FAXMES=$(sed -n '4s/.*[[:blank:]]\(\w*\)$/\1/p' $file)
Bezüglich der stats: Man kann die Daten auch über ls -l ermitteln, vielleicht geht das einfacher:
Code:FAXDAT=$(ls -l $file | cut -d" " -f 7 | sed 's/^\(\w*\)-\(\w*\)-\(\w*\)/\3.\2.\1/') FAXZEI=$(ls -l $file | cut -d" " -f 8)
<@Agnar> heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int
danke schön
ich probier das am montag aus und melde mich
liebe grüße
frank
hmmmm
also der erste punkt verwirrt mich
ich soll faxmes und tel
gegen kun und mess ersetzten ?
und das zweite klappt auch nicht zei und dat
ls -l gibt folgenes aus
-rwxrwxrwx 1 VORDEFINIERT\Administrators None 58 Dec 13 15:10
1_111111.fax
-rwxrwtrwa 1 VORDEFINIERT\Administrators None 74 Dec 19 09:24
1_111111.ftp
-rwxrwtrwa 1 VORDEFINIERT\Administrators None 274 Dec 19 09:24
1_111111.input
liebe grüße
frank
.
.
.
EDIT (autom. Beitragszusammenführung) :
.
hier noch mal das ganze programm
#!/bin/sh
export file='c:/qls/qls/kln/qsp/fax/log/1_111111.fax'
echo $file
if [ $(sed -n '1p' "$file") = "1" ]; then
KEY=${file%\.fax}
echo $KEY
FAXERR=$(sed -n '3p' "$file")
echo Error $FAXERR
FAXTEL=$(sed -n '4s/Betreff \(\w*\).*/\1/p' "$file")
echo Tel: $FAXTEL
FAXKUN=$(sed -n '4s/.*Nr[[:blank]\([0-9\-]*\).*/\1/p' $file)
echo Nr: $FAXKUN
FAXMES=$(sed -n '4s/.*[[:blank]\(\w*\)$/\1/p' $file)
echo Meld: $FAXMES
FAXDAT=$(ls -l $file | cut -d" " -f 7 | sed 's/^\(\w*\)-\(\w*\)-\(\w*\)/\3.\2.\1/')
echo dat: $FAXDAT
FAXZEI=$(ls -l $file | cut -d" " -f
echo Zeit: $FAXZEI
ls -l $file
cat << EOF > "$KEY.input"
.DBI 1 FAXREP 1
.KEY "$KEY"
.DDI FAXMES 0 1 "$FAXMES"
.DDI FAXTEL 0 1 "$FAXTEL"
.DDI FAXZK2 0 1 "$FAXKUN"
.DDI FAXDAT 0 1 "$FAXDAT"
.DDI FAXZEI 0 1 "$FAXZEI"
.DDI FAXERR 0 1 "$FAXERR"
.DDI FAXSYS 0 1 "TOBIT"
.DDI FAXKUN 0 1 &ZK2 $FAXKUN KBEZ
.DDI LTIME 0 1 @¹h:²m
EOF
cat << EOF > "$KEY.ftp"
user anonymous
delete $KEY.\$\$\$
quit
EOF
fi
und die datei: ($file)
----------------------------------------------
1
0
7
Betreff 003235685293 Nr 06-03052 , sent
----------------------------------------------
die nummer und den error findet er
Geändert von muemmi (19.12.2006 um 08:45 Uhr) Grund: Antwort auf eigenen Beitrag innerhalb von 24 Stunden!
Hallo
Es handelt sich hier nicht um eine Unix-shell!
Cygwin oder was auch immer du verwendest, ist nicht kompatibel zu einer bash oder ksh!
Folglich ist das hier eigentlich OT!
Ich möcht aber dennoch einen Tipp geben, obwohl ich eigentlich auf Windows nicht reagiere:
Das ls -l findet das Datum nur dann zuverlässig, wenn im Pfad oder Dateiname kein Leerzeichen vorkommt!
Du kannst aber versuchen mit sed das von Hinten aufzufädeln:
Wenn die Ausgabe deines ls -l so ausschaut:
Dann liefert:Code:-rwxrwxrwx 1 VORDEFINIERT\Administrators None 58 Dec 13 15:10 1_111111.fax -rwxrwtrwa 1 VORDEFINIERT\Administrators None 74 Dec 19 09:24 1_111111.ftp -rwxrwtrwa 1 VORDEFINIERT\Administrators None 274 Dec 19 09:24 1_111111.input
Das jetzt in deiner Variable verheizt, und du solltest das bekommen was du willst.Code:ls -l |sed -e 's|^.*[[:blank:]]\(\w\+[[:blank:]]\+[[:digit:]]\+\)[[:blank:]]\([[:digit:]]\+:\+[[:digit:]]\+\)[[:blank:]]\([^:]\+\)$|\1|g' Dec 13 Dec 19 Dec 19 #sprich das Datum ls -l |sed -e 's|^.*[[:blank:]]\(\w\+[[:blank:]]\+[[:digit:]]\+\)[[:blank:]]\([[:digit:]]\+:\+[[:digit:]]\+\)[[:blank:]]\([^:]\+\)$|\2|g' 15:10 09:24 09:24 # die Uhrzeit.
Gruß Wolfgang
Ich bin pure Nostalgie
Lesezeichen