Bash-Skript für den CDO-Befehl, um es auf verschiedenen Dateien auszuführen

Bash-Skript für den CDO-Befehl, um es auf verschiedenen Dateien auszuführen

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 . . . ; doneBefehl wird einmal mit wörtlichem Argument ausgeführt. ls *.ncDies 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"


  1. Warumnichtanalysieren ls?

verwandte Informationen