script bash para el comando cdo para ejecutarlo en diferentes archivos

script bash para el comando cdo para ejecutarlo en diferentes archivos

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 . . . ; doneel 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"


  1. Por quénoanalizar ls?

información relacionada