Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Dateinamenauslesen und sequenzieren, Shell, zsh

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.03.2005
    Beiträge
    68

    Dateinamenauslesen und sequenzieren, Shell, zsh

    Hi,

    ich habe hier einen Haufen Messdaten in Dateien gespeichert, in denen die Zeit nach dem Schema YYYYMMDD_HH.nc im Dateinamen selbst angegeben ist und leider in der Datei selbst nicht. Das will ich aendern.

    Dazu muss ich die Zeit aus dem Dateinamen auslesen und in die kommandozeilenbasierende Software cdo weitergeben.

    Der notwendige Befehl lautet z.B.
    Code:
    cdo settaxis,YYYY-MM-DD,HH:00,1hrour inputfile.nc outputfile.nc
    Bsp. fuer eine Datei:
    Die Datei B19990512_06.nc wird mit dem Befehl
    Code:
    cdo settaxis,1999-05-12,06:00,1hrour B19990512_06.nc B19990512_06_time.nc
    bearbeitet.

    Und Jetzt brauche ich halt eine Schleife, die das gesamte Verzeichnis abarbeitet. Am liebsten wuerde ich das der zsh erledigen.

    Besten Dank
    Stephcar
    MikTeX | TeXnicCenter
    TeX Live | gedit mit LaTeX-Erweiterung

  2. #2
    Registrierter Benutzer
    Registriert seit
    02.03.2005
    Beiträge
    68
    Ich habe mal folgendes probiert.

    Code:
    #!/bin/zsh
    set verbose
    
    for datei in * `ls B*`
    do
      YYYY =` echo $datei | cut -b2-5`
      MM =` echo $datei | cut -b6-7`
      DD =` echo $datei | cut -b8-9`
      HH =` echo $datei | cut -b11-12`
      cdo settaxis,$YYYY-$MM-$DD,$HH:00,1hour $datei ../time4/$datei
    done

    Aber laufen tut's nich; bei folgender Fehlermeldung:

    zsh@rays3:../test2% ./filename2file.sh
    ./filename2file.sh:7: 1999 not found
    zsh@rays3:../test2%
    MikTeX | TeXnicCenter
    TeX Live | gedit mit LaTeX-Erweiterung

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    lass mal die Leerzeichen in den Zuweisungen weg, das können die Shells nicht so gut ab:
    Code:
    YYYY=`echo ...`
    Und noch was: Statt der 4 cut-Befehle kannst Du einfacher einen einzigen sed benutzen, das spart Prozesse und damit Zeit:
    Code:
    jan@jack:~/tmp> echo B19990512_06.nc | sed -r 's/.(....)(..)(..)_(..)\..*/\1-\2-\3,\4:00,1hour/'
    1999-05-12,06:00,1hour
    Abhängig davon, wie die Dateinamen aufgebaut sind, musst Du ggf. die Regex ein wenig anpassen.

    Jan

    EDIT: In der Startzeile der Schleife ist noch was faul. Was soll der einzelne * da, der wird durch die Shell mit allen Dateien im aktuellen Verzeichnis ersetzt? Richtig wäre:
    Code:
    for datei in `ls B*`; do
    Geändert von jan61 (23-03-2009 um 21:04 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    02.03.2005
    Beiträge
    68

    Thumbs up

    Ja besten Dank, das mit der empfindlichen Syntax muss ich mir merken.
    Und das sed script ist auch cool.

    Also besten Dank!
    MikTeX | TeXnicCenter
    TeX Live | gedit mit LaTeX-Erweiterung

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •