reformata valores em uma tabela

0

Eu tenho algumas tabelas, nas quais preciso substituir vários valores. Eu tenho comandos diferentes sed e tr que funcionam bem quando eu os aplico em um único arquivo. Mas de alguma forma, quando eu quero construir um loop a partir desses comandos, ele não está funcionando. Aqui está o meu loop:

#!/bin/bash
in_dir=/home/stevens/SUMARIO/regional_model/data/basin
stations="almourol alton cuntan eldeim farakka koulikoro lobith louth olivenca stolb tangnaihai"
gcms="gfdl-esm2m hadgem2-es ipsl-cm5a-lr miroc-esm-chem noresm1-m"
scenarios="rcp8p5"

for station in ${stations};do
  echo "go to directory"
  cd ${in_dir}/${station}
  for gcm in ${gcms};do
    for rcp in ${rcps};do
      cd ${in_dir}/${station}
      echo "replace datum"
      sed 's/"datum"/"YEAR-MONTH-DAY"/g' ${station}_${gcm}_${scenario} > ${station}_${gcm}_${scenario}.c
      echo "delete hour"
      sed 's/ 12:00:00//g' ${station}_${gcm}_${scenario}.c > ${station}_${gcm}_${scenario}.cs
      echo "replace - to ;"
      tr "-" ";" < ${station}_${gcm}_${scenario}.cs > ${station}_${gcm}_${scenario}.csv
      rm ${station}_${gcm}_${scenario}.cs ${station}_${gcm}_${scenario}.c
    done
  done
done

Alguém tem uma ideia de porque esse loop não funciona?

    
por steve 12.07.2016 / 19:17

1 resposta

1
  1. você não definiu a variável rcps
  2. você definiu scenarios , mas usou scenario

Aqui está uma versão do seu script que corrige esses problemas e faz algumas outras melhorias:

  • formatado com novas linhas extras e recuo alinhado para melhorar a legibilidade
  • use matrizes em vez de cadeias separadas por espaço
  • use sed uma vez em vez de várias vezes mais tr
  • aspas duplas de todas as variáveis
  • aspas simples todas as cadeias fixas
  • define uma variável ( $fname ) para manter o nome do arquivo construído ( ${station}_${gcm}_${scenario} ) em vez de reconstruí-lo toda vez que você usá-lo, o que é muito mais difícil de ler E muito propenso a erros de digitação.
#!/bin/bash

in_dir='/home/stevens/SUMARIO/regional_model/data/basin'

stations=(almourol alton cuntan eldeim farakka koulikoro lobith louth
          olivenca stolb tangnaihai)

gcms=(gfdl-esm2m hadgem2-es ipsl-cm5a-lr miroc-esm-chem noresm1-m)

scenario='rcp8p5'

rcps=(a b c)

for station in "${stations[@]}" ; do
  cd "${in_dir}/${station}"

  for gcm in "${gcms[@]}"; do
    for rcp in "${rcps[@]}" ; do

      fname="${station}_${gcm}_${scenario}"
      echo "replace datum: $fname"

      sed -e 's/"datum"/"YEAR-MONTH-DAY"/g;
              s/ 12:00:00//g;
              s/-/;/g' "$fname" > "${fname}.csv"
    done
  done
done

Se você quiser substituir a string "datum" por uma data real, terá que fazer algo como:

  1. defina YMD=$(date +%Y-%m-%d) junto com as outras variantes e matrizes
  2. e reescreva o script sed desta forma:
      sed -e 's/"datum"/"'"${YMD}"'"/g;
              s/ 12:00:00//g;
              s/-/;/g' "$fname" > "${fname}.csv"

BTW, se você realmente quis ter vários cenários, você terá que definir scenarios como outro array e adicionar outro loop for scenario in "${scenarios[@]}" ; do ..... done

    
por 13.07.2016 / 07:41

Tags