awk, 매개변수 세트를 사용하여 파일 값을 변경하는 방법은 무엇입니까?

awk, 매개변수 세트를 사용하여 파일 값을 변경하는 방법은 무엇입니까?

를 사용하여 데이터를 재설정하려고 합니다 awk. 다음 스크립트를 사용하여 6개의 열 값을 변경하려는 54개 열의 데이터가 있습니다.

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

내 데이터는 다음과 같습니다

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                                                       

위 스크립트를 실행하면 할당된 매개변수 세트의 값이 변경되지 않고 매개변수가 간단하게 변경됩니다.

이 점에 관해 저를 도와주시겠어요?

답변1

당신이 직면한 문제는 작은 따옴표로 보호되는 awk 명령 내에서 BASH 변수를 사용하려고 한다는 것입니다('...' . 작은 따옴표 안에 bash는~ 아니다변수(예 ${BI2}: )를 확장하면 awk가 문자 그대로 보고 $6 = "${BI2}"6번째 열의 값을 리터럴로 설정합니다 "${B12}".

운 좋게도 (일명 ) 인수를 사용하여 변수 awk에서 변수를 쉽게 만들 수 있습니다 .shell--assign-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;
  }'

답변2

스크립트를 작은따옴표로 묶습니다 awk. 이는 쉘이 awk에 의해 정의된 변수(예: )를 대체하려고 시도하는 것을 방지하기 때문에 일반적으로 권장됩니다 $1. 불행하게도 이는 쉘이 $BI2. awk대신 호출을 큰따옴표로 묶는 경우 :

awk "{if(\$1==2) {
  \$6 = ${BI2}
  \$7 = ${DS2}
  \$8 = ${DSMAX2}
  \$9 = ${WS2}
  \$25 = ${D22}
  \$26 = ${D32}}
  print \$0;}" soil_params > tmp

그러면 쉘이 교체됩니다 ${BI2}. 그러나 이제는 셸이 해당 변수에 대한 값을 제공하려고 시도하는 것을 방지하기 위해 awk와 같은 변수를 $1작성해야 합니다 .\$1

관련 정보