を使用してデータをリセットしようとしていますawk
。 54のデータ列がありますが、次のスクリプトを使用してそのうち6つの値を変更したいと思います。
#!/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
。残念ながら、これは、シェルが、たとえばIfなど、自分だけが知っている変数を置き換えることができないことを意味します$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