Soy nuevo en UNIX y quiero aplicar el comando "remapbil" del CDO (Operador de datos climáticos) para transformar la cuadrícula (de una proyección a un sistema de coordenadas geográficas). funciona perfectamente bien para 1 solo archivo con el siguiente comando:
cdo remapbil,target.grd hurs_EUR-11_ICHEC-EC-EARTH_rcp26_r3i1p1_DMI-HIRHAM5_v1_day_20360101-20401231.nc hurs_36_40_bil.nc
Pero tengo que hacerlo para muchos archivos diferentes. Por esta razón, intenté escribir el siguiente shell bash que me permitirá ejecutar el comando remapbil para todos los archivos que tengo en mi directorio:
#!/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
Pero siempre recibo el siguiente error:
cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.
Probablemente alguien pueda ayudarme, sería genial.
Respuesta1
Ejecutará for file in "ls *.nc"; do . . . ; done
el comando una vez, con un argumento literal ls *.nc
, como puede confirmar de la siguiente manera:
$ ls *.nc
bar.nc foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc
Presumiblemente tenías la intención desustitución de comandousando comillas invertidas en lugar de comillas doblespero eso sería una mala idea1 y es innecesario ya que ya está recorriendo los archivos usando un shell global (seguro si se cita entre comillas). Entonces:
for i in *.nc;
do
echo $i
cdo remapbil,target.grd "$i" > "tas_${i}_bil.nc"
done
Si desea eliminar y reemplazar la extensión en el archivo de salida, puede cambiar "tas_${i}_bil.nc"
a"tas_${i%.nc}_bil.nc"