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 . . . ; done
comando 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"