suchen und ersetzen, Format erhalten

Hi,

so habe die zwei if schleifen angepasst. Habe auch alle Tabulatoren durch Leerzeichen ersetzt. Let habe ich teilweise raus genommen.

Der Code läuft jetzt ohne Fehler durch, was raus kommt stimmt aber noch nicht. Aber dadrauf kann ich jetzt erstmal aufbauen.

Waren also mehrere Fehler die sich aneinander gereiht hatten. Da bei den if Befehlen keine Fehlermeldung kam, dachte ich die sind richtig bzw. funktionieren so auch.

Vielen Dank fürs erste. Werden bestimmt noch weitere Fragen auftauchen...

Gruß Tim

Code:
#!/bin/sh
#

set -x
SKRIPT_DIR=`dirname $0`

INPUT_FILE=$SKRIPT_DIR/eingabe.txt
AWK_FILE=$SKRIPT_DIR/ersetzen.awk
VARIA_FILE=$SKRIPT_DIR/tabelle.txt #Werte durch Tab trennen
TEMPLATE_FILE=$SKRIPT_DIR/template.txt
RESULT_DIR=$SKRIPT_DIR/results

echo SKRIPT_DIR : $SKRIPT_DIR
echo VARIA_FILE : $VARIA_FILE
echo TEMPLATE_FILE : $TEMPLATE_FILE

#Anzahl der Variationen auslesen
NR_VARIA=`awk '{if (NF>0) print}' $VARIA_FILE | awk 'END {print NR-1}'`
echo $NR_VARIA

#Namen der Variablen auslesen
VAR_NAMES=`awk '{if (NR==1) print}' $VARIA_FILE`
echo $VAR_NAMES

##########################################################################
# AWK_FILE zusammenbasteln (muss nur einmal gemacht werden)
##########################################################################
echo "#!/bin/awk -f" > $AWK_FILE
echo >> $AWK_FILE
echo "{" >> $AWK_FILE
for i in $VAR_NAMES; do

  echo "gsub(/$i/,$i,\$0)" >> $AWK_FILE

done
echo "print \$0" >> $AWK_FILE
echo "}" >> $AWK_FILE


START=1
j=$START
  # Jede Zeile ab der zweiten aus VARIA_FILE
  # auslesen und den Variablennamen zuordnen
  # solange $j kleiner $NR_VARIA mache ...
  while [ $j -le $NR_VARIA ]; do
    LAUF=$j
    let ZEILE=$j+1
    echo
    echo "**********************************************************"
    echo "* Lauf $LAUF von $NR_VARIA"
    echo "**********************************************************"
    # VAR_VALUES anhand der aktuellen Zeile definieren
    VAR_VALUES=`sed -n "$ZEILE"p $VARIA_FILE`

    echo $VAR_VALUES

    # Kommandozeile zum Aufruf von AWK_FILE zusammenbasteln. Variablen werden
    # als Parameter übergeben. Aufruf erfolgt in der Form:
    # "awk -f $AWK_FILE varname1=varvalue1 varname2=varvalue2 $TEMPLATE_FILE > $INPUT_FILE"
    k=1
    AWK_LINE="awk -f $AWK_FILE "
      for i in $VAR_NAMES; do
        FS="[ :\t]+"
        VAR_VALUE=`echo "$VAR_VALUES" | cut -f $k`
        AWK_LINE=`echo $AWK_LINE "$i=$VAR_VALUE "`
        let k=$k+1
      done
    echo
    AWK_LINE=`echo $AWK_LINE $TEMPLATE_FILE`

    # Erstellen des INPUT_FILE
    $AWK_LINE > $INPUT_FILE

    # Erstellen des Ergebnis-Verzeichnis
    if [ echo find $SKRIPT_DIR -name "results" ="./results" ]; then
      rm $RESULT_DIR
    fi #else mkdir $SKRIPT_DIR/results

    if [ echo find $SKRIPT_DIR -name "results" != ".results"]; then
      mkdir $SKRIPT_DIR
    fi

    LAUF=`echo "$VAR_VALUES" | cut -f 1`
    mkdir $RESULT_DIR/L$LAUF

    # Bewegen von $INPUT_FILE in das Ergebnis-Verzeichnis
    mv $INPUT_FILE $RESULT_DIR/L$LAUF

    let j=$j+1
  done


# Aufräumen
rm $AWK_FILE
set +x

jetzt geht er!! 2 / hatten noch gefehlt.

Gruß Tim
 
Zuletzt bearbeitet:
Hallo,

würde das Skript gerne mit einigen if Befehlen erweitern. Wenn ich die aber ins Skript einfüge, dann bekomme ich wieder Probeleme mit meiner While-Bedingung. Gibt dann wieder den Fehler: syntax error near unexpected token 'done'.

anstelle von:
Code:
  mv $OUTPUT_FILES_DZP $RESULT_DIR/L$LAUF

will ich folgendes einsetzen:

Code:
    #Ordnerbezeichung abhänging von der Größenordnung von $NR_VARIA
    # $NR_VARIA > 10
    if [10 <= $NR_VARIA < 100]; then
        if [$LAUF < 10]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L0$LAUF
        else mv $OUTPUT_FILES_DZP $RESULT_DIR/L$LAUF
        fi
    fi

    # $NR_VARIA 10-999
    if [100 <= $NR_VARIA < 1000]; then
        if [$LAUF < 10]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L00$LAUF
        fi
        if [$LAUF < 100 ]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L0$LAUF
        fi
    fi

    # $NR_VARIA 1000-9999
    if [1000 <= $NR_VARIA < 10000]; then
        if [$LAUF < 10]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L000$LAUF
        fi
        if [$LAUF < 100 ]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L00$LAUF
        fi
        if [$LAUF < 1000 ]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L0$LAUF
        fi
    if

    # $NR_VARIA 10000-99999
    if [$NR_VARIA >= 10000]; then
        if [$LAUF < 10]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L0000$LAUF
        fi
        if [10 <= $LAUF < 100 ]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L000$LAUF
        fi
        if [100 <= $LAUF < 1000 ]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L00$LAUF
        fi
        if [1000 <= $LAUF < 10000 ]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L0$LAUF
        fi
        if [10000 <= $LAUF]; then
             mv $OUTPUT_FILES_DZP $RESULT_DIR/L$LAUF
        fi
    fi

Sinn soll sein, dass abhängig von der Laufnummer die Ordner unterschiedlich benannt werden. Soll einfach danach sauberer aussehen und auch im explorer chronologisch darstellbar sein.

versteh einfach nicht, warum er da Probleme bekommt. Die if-Bedingungen sollten alle Standard-konform sein.

Gruß Tim
 
Hallo bytepool,

sorry, der Satz hängt jetzt als Postit an meinem Bildschirm!!

Aber leider besteht das Problem trotz aller eingefügten Leerzeichen innerhalb der eckigen Klammern weiterhin.

Gruß
 
Hi,

Code:
if [10 <= $LAUF < 100 ]; then
da liegt das naechste Problem, das ist kein gueltiger Ausdruck. Das sind zwei Bedingungen die mit einem "und" verknuepft werden muessen.
Ausserdem kannst du kein <, >, <= oder >= verwenden, die korrekten tests sind -gt, -lt etc., siehe "man test".
Die Symbole funktionieren nur, wenn du statt '[ ]' '[[ ]]' verwendest.

mfg,
bytepool
 
Hi,

habe jetzt alle Test-Befehle gemäß der Syntax mit -lt und -ge gemacht.

Auch da dran liegt es nich.

Hier mal der Code zum erstellen der Verzeichnisse:

Code:
    #Ordnerbezeichung abhänging von der Größenordnung von $NR_VARIA
    # $NR_VARIA 0-99
    if [ $NR_VARIA -ge 10 ] -a [ $NR_VARIA -lt 100 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    fi

    # $NR_VARIA 100-999
    if [ $NR_VARIA -ge 100 ] -a [ $NR_VARIA -lt 1000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    fi

    # $NR_VARIA 100 -9999
    if [ $NR_VARIA -ge 1000 ] -a [ $NR_VARIA -lt 10000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L000$LAUF
        fi
        if [ $LAUF -lt 100 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    fi 

    # $NR_VARIA 10000-99999
    if [ $NR_VARIA -ge 10000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L0000$LAUF
        fi
        if [ $LAUF -lt 100 ]; then
             mkdir $RESULT_DIR/L000$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 10000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    if

Gruß Tim
 
Hi,

habe jetzt alle Test-Befehle gemäß der Syntax mit -lt und -ge gemacht.

Auch da dran liegt es nich.
jain, du machst dir ja auch immer neue Syntaxfehler. Im uebrigen solltest du immer die konkrete Fehlermeldung nochmal mit angeben.

Code:
if [ $NR_VARIA -ge 10 ] -a [ $NR_VARIA -lt 100 ]; then
Neue Fehlermeldung ist "-bash: [: too many arguments"?
Das -a gehoert mit in die Klammer, eine if Abfrage wertet genau einen Befehl aus, aber du hast dort drei stehen. Wobei -a natuerlich kein eigenstaendiger Befehl ist.

mfg,
bytepool
 
Hi,

erstmal Danke, dass du dir die Mühe machst mir die ganze Zeit zu helfen! :respekt: Bringt mir echt viel, merke selber wie ich immer mehr von alleine schon zum laufen bekomme. Aber nach 2,5 Wochen ist man eben trotzdem noch blind für ettliche Fehler.

Also habe jetzt die beiden Testabfragen in eine Klammer gepackt und mit -a "gekoppelt".

Code:
    #Ordnerbezeichung abhänging von der Größenordnung von $NR_VARIA
    # $NR_VARIA 0-99
    if [ $NR_VARIA -ge 10 -a $NR_VARIA -lt 100 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    fi

    # $NR_VARIA 100-999
    if [ $NR_VARIA -ge 100 -a $NR_VARIA -lt 1000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    fi

    # $NR_VARIA 100 -9999
    if [ $NR_VARIA -ge 1000 -a $NR_VARIA -lt 10000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L000$LAUF
        fi
        if [ $LAUF -lt 100 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    fi 

    # $NR_VARIA 10000-65353
    if [ $NR_VARIA -ge 10000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L0000$LAUF
        fi
        if [ $LAUF -lt 100 ]; then
             mkdir $RESULT_DIR/L000$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 10000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    if

Bekomme da dann folgenden Fehler:

Code:
./testlauf2.sh: line 271: syntax error near unexpected token `done'
./testlauf2.sh: line 271: `done'

ich versteh es einfach nicht, was er bei der oberen Konstruktion den Fehler rein bringt. Wenn ich einfach
Code:
mkdir $RESULT_DIR/L$LAUF
schreibe, funktionierts ohne jegliche Probleme, also muss an der ganzen If-Schleifenkonstruktion irgendwas dran sein, dass mir dann die große While-Bedingung zerschießt.

Gruß Tim
 
ich versteh es einfach nicht, was er bei der oberen Konstruktion den Fehler rein bringt.
Tippfehler beim letzten fi:
Code:
    # $NR_VARIA 10000-65353
    if [ $NR_VARIA -ge 10000 ]; then 
        if [ $LAUF -lt 10 ]; then
             mkdir $RESULT_DIR/L0000$LAUF
        fi
        if [ $LAUF -lt 100 ]; then
             mkdir $RESULT_DIR/L000$LAUF
        fi
        if [ $LAUF -lt 1000 ]; then
             mkdir $RESULT_DIR/L00$LAUF
        fi
        if [ $LAUF -lt 10000 ]; then
             mkdir $RESULT_DIR/L0$LAUF
        else mkdir $RESULT_DIR/L$LAUF
        fi
    [B]if[/B]

mfg,
bytepool
 
Hi,

ich glaubs net!! Da siehst den Wald vor lauter Bäumen nicht mehr. Danke dir!

Hätten die Shell-Väter nicht mal ne bessere Fehlerdetektierung einbauen können :D. Wenn der mir direkt die Zeile gesagt hätte, dann hätt ich das bestimmt auch von alleine noch gefunden.

edit:
Gut das ich mir das Postit gemacht habe, der Fehler passiert so schnell. Aber die Fehler habe ich jetzt wirklich Zeilengenau angezeigt bekommen. Da hab selbst ich ihn gefunden!

Gruß
 
Zuletzt bearbeitet:
Hi,

nur als Anregung/Ergänzung: eventuell könntest du die ganzen if-Kaskaden einsparen, indem du
- mit "expr" die Länge von "$NR_VARIA" bestimmst, und
- den Namen des Ziel-Directories dann mit "printf" auf diese Breite bringst,
also etwa:
Code:
LAENGE=`expr "$NR_VARIA" : '.*'`
LAUFDIR=`printf "L%0*d" $LAENGE $LAUF`
mkdir $RESULT_DIR/$LAUFDIR
mv ...
Gruss, A.
 
Hallo,

ja, das ist mal deutlich kürzer und wahrscheinlich dadurch auch wesentlich schneller, da er nicht zig Bedingungen überprüfen muss. Danke.

Wieder was dazu gelernt.

Code:
printf "L%0*d" $LAENGE $LAUF

printf gibt mir also einen Ausdruck nach dem angegebenen Format aus. Das "L" steht am Anfang, das ist fest. das "%" verweißt auf $LAENGE, gibt also die Länge des Strings nach dem "L" an. Das 0* ist der Auffüller, wenn d bzw. $LAUF weniger wie $LAENGE Stellen hat. Stimmt das so?

edit:
habe jetzt mal eine große Menge an Variationen gerechnet und bei der letzten bringt er mir wieder die Fehlermeldung mit dem : syntax error near unexpected token 'done'
Aber eigentlich ist alles richtig ausgeführt. Versteh nicht, warum er über 1000 mal durchläuft ohne zu meckern und dann beim letzten sich verhaut?!

Gruß
 
Zuletzt bearbeitet:
Hi,

den Format-String hast du schon weitgehend richtig interpretiert; der '*' darin steht an Stelle einer Zahl, die die gewünschte Länge angeben würde, und weist printf an, dafür das nächste Argument, also $LAENGE, zu verwenden.

Mit welchen Werten führt das Skript jetzt zum Abbruch? Ist das reproduzierbar? Du könntest das Skript mal mit "sh -x SKRIPT" ausführen, um zu sehen, was gerade ausgeführt werden soll, wenn der Fehler auftritt. Oft liegt so etwas ganz einfach an fehlenden Quotes um irgendwelche Variablen o.ä. ...

Gruss, A.
 
Hallo,

habe gerade nochmal eine Rechnung angestoßen, dieses mal aber nur 16 zur Kontrolle ob da die Fehlermeldung auch kommt. Kam aber nicht.
Daher werde ich die erstmal nicht weiter beachten, da das Skript eigentlich komplett richtig ausgeführt wird. Sobald ich dann dauerhaft die Fehlermeldung bekomme suche ich dann im akuten Fall nach dem Fehler.

Das mit -x kenne ich, hat mir schon einige Fehler offenbart.

Gruß
 

Ähnliche Themen

Suchen und Ersetzen mit regulärem Ausdruck

Python Script Hilfe

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Wertebereich ersetzen mit sed

SED und TCPDUMP

Zurück
Oben