使用 awk 循环遍历变量时的错误语法



>我有以下数组

components=('xx' 'xy' 'xz' 'yx''yy''yz''zx''zy''zz')

我正在为所有组件执行以下循环

for i in "${components[@]}"
    do
    if [ ${i: -1} == "x" ]; then
    awk '$1 == "*" && $2 == ${i: -1} {v=$3} END {print v}' ${i}_E_cutoff_$((100*$a))_eV/$systemID.castep >> Stress_${i}_vs_Ecutoff_convergence.txt
    elif [ ${i: -1} == "y" ]; then
    awk '$1 == "*" && $2 == ${i: -1} {v=$4} END {print v}' ${i}_E_cutoff_$((100*$a))_eV/$systemID.castep >> Stress_${i}_vs_Ecutoff_convergence.txt
    elif [ ${i: -1} == "z" ]; then
    awk '$1 == "*" && $2 == ${i: -1} {v=$5} END {print v}' ${i}_E_cutoff_$((100*$a))_eV/$systemID.castep >> Stress_${i}_vs_Ecutoff_convergence.txt
    fi      
    done

为什么awk告诉我我有一个语法错误

$2 == ${i: -1}

您收到该语法错误的原因是您无法单独使用awk命令中的外部变量。你首先需要告诉awk关于他们的信息。

这里有一篇关于如何做到这一点的非常好的帖子:如何在 awk 脚本中使用 shell 变量?

使用上面的答案,您可以执行以下操作:

awk -v var=${i: -1} '$1 == "*" && $2 == var {v=$3} {print v}' ${i}_E_cutoff_$((100*$a)) _eV/$systemID.castep >> Stress_${i}_vs_Ecutoff_convergence.txt

-v var=${i: -1}在哪里注册变量以供 awk 使用。

希望这有帮助!

最新更新