script bash para o comando cdo para executá-lo em arquivos diferentes

script bash para o comando cdo para executá-lo em arquivos diferentes

Sou novo no UNIX e quero aplicar o comando "remapbil" do CDO (Climate Data Operator) para transformar a grade (de uma projeção em sistema de coordenadas geográficas). funciona perfeitamente bem para 1 único arquivo com o seguinte 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

Mas tenho que fazer isso para vários arquivos diferentes. Por esse motivo, tentei escrever o seguinte shell bash que me permitirá executar o comando remapbil para todos os arquivos que tenho em meu diretório:

#!/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

Mas sempre recebo o seguinte erro:

cdo remapbil (Abort): Too few streams specified! Operator needs 1 input and 1 output streams.

Provavelmente alguém pode me ajudar, isso seria ótimo

Responder1

O for file in "ls *.nc"; do . . . ; donecomando será executado uma vez, com argumento literal ls *.nc- como você pode confirmar a seguir:

$ ls *.nc
bar.nc  foo.nc
$ for file in "ls *.nc"; do echo "$file" ; done
ls *.nc

Você provavelmente pretendia umsubstituição de comandousando crases no lugar de aspas duplasmas isso seria uma má ideia1 e é desnecessário, pois você já está fazendo um loop nos arquivos usando um shell glob (seguro se citado). Então:

for i in *.nc;
do
echo $i
cdo remapbil,target.grd  "$i" > "tas_${i}_bil.nc"
done

Se quiser remover e substituir a extensão no arquivo de saída, você pode alterar "tas_${i}_bil.nc"para"tas_${i%.nc}_bil.nc"


  1. Por quenãoanalisar ls?

informação relacionada