我的代码的简化版本如下所示:
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
一种选择是将 shell 变量传递到awk
,这样可以避免重新引用:
awk 'NR>13 {if ($4==dmn) print $1, $2, $3, $4;}' dmn="${DMN[$i]}" domain_all.dat >> ddh_domain_${DMN[$i]}.dat
我也倾向于重构你的 shell 脚本,以便将变量传递到你的 shell 函数中:
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