Я новичок в UNIX и хочу применить команду CDO (Climate Data Operator) "remapbil" для преобразования сетки (из проекции в географическую систему координат). Это прекрасно работает для одного файла с помощью следующей команды:
cdo remapbil,target.grd hurs_EUR-11_ICHEC-EC-EARTH_rcp26_r3i1p1_DMI-HIRHAM5_v1_day_20360101-20401231.nc hurs_36_40_bil.nc
Но мне нужно сделать это для множества разных файлов. По этой причине я попытался написать следующую оболочку bash, которая позволит мне запустить команду remapbil для всех файлов в моем каталоге:
#!/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
Но я всегда получаю следующую ошибку:
cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.
Может ли кто-нибудь мне помочь? Это было бы здорово.
решение1
Команда for file in "ls *.nc"; do . . . ; done
будет выполнена один раз с буквальным аргументом ls *.nc
, в чем вы можете убедиться следующим образом:
$ ls *.nc
bar.nc foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc
Вы, вероятно, намеревалисьзамена командыиспользование обратных кавычек вместо двойныхно это была бы плохая идея1 и не является необходимым, так как вы уже циклически проходите по файлам, используя (безопасный, если заключен в кавычки) shell glob. Итак:
for i in *.nc;
do
echo $i
cdo remapbil,target.grd "$i" > "tas_${i}_bil.nc"
done
Если вы хотите удалить и заменить расширение в выходном файле, вы можете изменить "tas_${i}_bil.nc"
его на"tas_${i%.nc}_bil.nc"