AWK 在等式表达式中使用变量

AWK 在等式表达式中使用变量

我的代码的简化版本如下所示:

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

相关内容