awk, como alterar o valor do arquivo usando conjuntos de parâmetros?

1

Estou tentando redefinir meus dados usando awk . Eu tenho um dados de 54 colunas onde eu quero alterar seis dos valores da coluna usando o script a seguir.

#!/bin/bash -x
# optimal parameters
set BI2=0.02841513
set DS2=0.37837487
set WS2=0.85392380
set D22=1.00048351
set D32=0.63893676
set DSMAX2=28.15795517

# change the calibration parameter
awk '{if($1==2) {
  $6 = "${BI2}"
  $7 = "${DS2}"
  $8 = "${DSMAX2}"
  $9 = "${WS2}"
  $25 = "${D22}"
  $26 = "${D32}"}
  print $0;}' soil_params > tmp
mv -f tmp soil_params

meus dados se parecem com:

999 0   123 65.183534   -147.655522 0.2 0.001   10  0.9 2   10.84   9.79    9.76    812.42  1546.28 1334.35 -999    -999    -999    18.579  68.139  26.914  548 0.1 0.3 0.192752    -0.8725 4   35.39   30.13   19.34   0.323   0.347   0.382   1160.4  1196.2  1208.9  2186.08 2253.52 2411.44 -9.8    0.582   0.489   0.443   0.396   0.4841  0.28    0.001   0.0005  383.7   0.1 0.1 0.1 1   16.733299   16.733299                                           
2   1   124 65.183534   -147.639897 ${BI2}  ${DS2}  ${DSMAX2}   ${WS2}  2   10.84   9.79    9.77    812.51  1544.96 1331.78 -999    -999    -999    18.579  68.277  26.915  676 0.1 ${D22}  ${D32}  -0.529166   4   35.45   30.19   19.37   0.323   0.347   0.382   1160.3  1196.3  1208.8  2185.87 2253.63 2411.11 -9.8    0.582   0.49    0.443   0.396   0.4851  0.28    0.001   0.0005  400.8   0.1 0.1 0.1 1   16.32   16.32                                                       

quando eu executo o script acima, ele não altera o valor do conjunto de parâmetros atribuído, mas sim as simples alterações nos parâmetros, como você pode

Você poderia me ajudar nesse sentido?

    
por AiB 30.09.2013 / 11:24

2 respostas

3

o problema que você está enfrentando é que você está tentando usar variáveis BASH dentro do comando awk que é protegido por aspas simples ( '...' ). dentro de aspas simples, o bash não expande as variáveis (por exemplo, ${BI2} ), então o awk literalmente verá $6 = "${BI2}" e irá definir o valor da sexta coluna como o literal "${B12}" . / p>

Felizmente, você pode criar facilmente awk variables a partir de shell variables usando o argumento --assign (aka -v ):

awk \
   -v BI2="${BI2}" \
   -v DS2="${DS2}" \
   -v DSMAX2="${DSMAX2}" \
   -v WS2="${WS2}" \
   -v D22="${D22}" \
   -v D32="${D32}" \
  '{if($1==2)
     {
      $6 = BI2; $7 = DS2; $8 = DSMAX2; $9 = WS2; $25 =D22; $26 =D32; 
     }
    print $0;
  }'
    
por 30.09.2013 / 14:27
1

Você coloca o script awk entre aspas simples, isso geralmente é recomendado porque impede que o shell tente substituir as variáveis definidas pelo awk, como $1 . Infelizmente, isso também significa que o shell não pode substituir nas variáveis apenas as que ele conhece, como $BI2 . Se você encapsular sua invocação de awk entre aspas duplas:

awk "{if(\==2) {
  \ = ${BI2}
  \ = ${DS2}
  \ = ${DSMAX2}
  \ = ${WS2}
  \ = ${D22}
  \ = ${D32}}
  print \
awk "{if(\==2) {
  \ = ${BI2}
  \ = ${DS2}
  \ = ${DSMAX2}
  \ = ${WS2}
  \ = ${D22}
  \ = ${D32}}
  print \%pre%;}" soil_params > tmp
;}" soil_params > tmp

o shell substituirá ${BI2} e tal. No entanto, agora as variáveis que awk usa, como $1 , precisam ser gravadas como \ para evitar que o shell tente fornecer valores para elas.

    
por 30.09.2013 / 14:30