Ich bin neu bei UNIX und möchte den CDO-Befehl (Climate Data Operator) „remapbil“ anwenden, um das Raster umzuwandeln (von einer Projektion in ein geografisches Koordinatensystem). Mit dem folgenden Befehl funktioniert das für eine einzelne Datei einwandfrei:
cdo remapbil,target.grd hurs_EUR-11_ICHEC-EC-EARTH_rcp26_r3i1p1_DMI-HIRHAM5_v1_day_20360101-20401231.nc hurs_36_40_bil.nc
Aber ich muss das für viele verschiedene Dateien tun. Aus diesem Grund habe ich versucht, die folgende Bash-Shell zu schreiben, mit der ich den Befehl remapbil für alle Dateien in meinem Verzeichnis ausführen kann:
#!/bin/bash
for i in *.nc;
do
echo $i
for file in "ls *.nc"; do
cdo remapbil,target.grd tas_EUR-11_ICHEC-EC-EARTH_rcp45_r3i1p1_DMI-HIRHAM5_v1_day_20210101-20251231.nc > tas_$i_bil.nc
done
done
Aber ich bekomme immer die folgende Fehlermeldung:
cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.
Kann mir bestimmt jemand weiterhelfen, das wäre super
Antwort1
Der for file in "ls *.nc"; do . . . ; done
Befehl wird einmal mit wörtlichem Argument ausgeführt. ls *.nc
Dies können Sie wie folgt bestätigen:
$ ls *.nc
bar.nc foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc
Sie wollten vermutlich eineBefehlsersetzungVerwendung von Backticks anstelle von Anführungszeichenaber das wäre keine gute Idee1 und ist unnötig, da Sie bereits mit einem (sicheren, wenn in Anführungszeichen gesetzten) Shell-Glob über die Dateien schleifen. Also:
for i in *.nc;
do
echo $i
cdo remapbil,target.grd "$i" > "tas_${i}_bil.nc"
done
Wenn Sie die Erweiterung in der Ausgabedatei entfernen und ersetzen möchten, können Sie "tas_${i}_bil.nc"
Folgendes ändern:"tas_${i%.nc}_bil.nc"