私のコードの単純化されたバージョンは次のとおりです。
declare -a DMN=(" " "200" "190" "180")
NRL=3
runDHFiles()
{
awk 'NR>13 {if ($4==$DMN[$i]) print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat
}
for ((i = 1; i <= NRL; i++ )); do
runDHFiles
done
大量のExcelファイルを繰り返しながら、フィールドフラグ(列4)が特定の数字と同じ行をコピーしようとします。
これはうまくいきます。
if ($4==200)
これはうまくいきません。
if ($4==$DMN[$i])
ループ内の等しい文の配列値にどのようにアクセスしますか?
ありがとう、
レイプ
答え1
1つのオプションは、シェル変数をに渡してawk
再参照するのを防ぐことです。
awk 'NR>13 {if ($4==dmn) print $1, $2, $3, $4;}' dmn="${DMN[$i]}" domain_all.dat >> ddh_domain_${DMN[$i]}.dat
私もシェル関数に変数を渡すためにシェルスクリプトをリファクタリングする傾向があります。
declare -a DMN=(" " "200" "190" "180")
NRL=3
runDHFiles()
{
local dmn="$1"
awk 'NR>13 && $4==dmn {print $1, $2, $3, $4;}' dmn="$dmn" domain_all.dat >> "ddh_domain_${dmn}.dat"
}
for ((i=1; i<=NRL; i++ ))
do
runDHFiles "${DMN[$i]}"
done
答え2
bash配列変数を「見る」ように参照を変更すると改善されます。
awk 'NR>13 {if ($4=="'"$DMN[$i]"'") print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat
つまり、一重引用符部分を一時的に終了します(そして二重引用符を使用して文字列にしますawk
)。
-v
または(一部の人は好み)変数を宣言するオプションを使用してから、次を使用します。awk
それスクリプトから:
awk -v value=DMN[$i] 'NR>13 {if ($4==value) print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat