【问题标题】:Error syntax when looping over a variable using awk使用 awk 循环变量时的错误语法
【发布时间】:2019-07-12 16:50:05
【问题描述】:

我有以下数组

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}

【问题讨论】:

  • 我想你想要在“元素”yy''yz''zx''zy''zz'之间有空格。
  • 我试图修改你的逻辑(有一个没有if-elif-elif-fiawk 命令),但我看不出你真正想要什么。我认为$((100*$a)) 与您的问题无关。您使用$1 == "*",这是输入文件中一行的第一个字段还是您使用变量调用循环?似乎您希望对组件xy 使用此功能:在xy_ 输入文件中查找以* xy 开头的最后一行(* 不是通配符)并将该行的第四个字段附加到您的输出中。这是你想要的吗?
  • 添加示例输入和所需输出将使您的问题更容易理解。在编辑问题时,您可能希望将输入和输出文件更改为 ${i}.in${i}.out

标签: arrays string bash indexing


【解决方案1】:

您收到语法错误的原因是您无法单独在 awk 命令中使用外部变量。您首先需要告诉 awk。

这是一篇关于如何做到这一点的非常好的帖子:How do I use shell variables in an awk script?

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

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 使用。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2014-01-23
    • 2018-07-08
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多