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

0

Eu sou novo no UNIX e quero aplicar o comando "remapbil" do CDO (Climate Data Operator) para transformar a grade (de uma projeção para um sistema de coordenadas geográficas). funciona perfeitamente bem para 1 arquivo único 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 eu tenho que fazer isso para muitos arquivos diferentes. Por esta razão, eu tentei escrever o seguinte shell bash que me permitirá executar o comando remapbil para todos os arquivos que eu tenho no 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

    
por C.Utz 23.11.2017 / 15:31

1 resposta

0

O for file in "ls *.nc"; do . . . ; done executará o comando uma vez, com o argumento literal ls *.nc - como você pode confirmar da seguinte forma:

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

Você presumivelmente pretendia uma substituição de comandos usando backticks no lugar de aspas duplas , mas isso seria uma má idéia 1 e é desnecessário, já que você já estão circulando os arquivos usando um shell (seguro, se citado) glob. Então:

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

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

  1. Por que não analisa ls ?
por 23.11.2017 / 16:11