【问题标题】:External variable in awkawk 中的外部变量
【发布时间】:2012-11-19 17:13:52
【问题描述】:

我有一个脚本,其中一个脚本sn-p是:

x=3
awk '$2=$x{print $1}' infile

外部变量是x

但是在awk提示错误

那么在这种情况下,如何让awk运行成功呢?

【问题讨论】:

  • 以后,请在编辑框顶部包含准确的错误输出,使用 {} 工具格式化。另外,你的意思是 $2=$x 吗?这会将 $x 的值分配给每行中的 $2 变量。您可能希望将 $2 与 x 值进行比较,因此请使用 $2 == x。祝你好运。

标签: shell awk


【解决方案1】:

您使用-v 选项传递一个外部变量以在awk 中使用:

some_variable=3
awk -v x=$some_variable '$2 == x {print $1}' infile

另请注意,您需要将代码从 $2=$x 更改为 $2 == x

  • 使用== 代替=:后者是赋值
  • 不要在awk 脚本中为普通变量添加前缀$

另外:您需要为每个要传入的变量指定一个-v,例如:

var1=2
var2=4
awk -v x=$var1 -v y=$var2 '$2 == x {print y " " $1}' infile

【讨论】:

  • 请注意,您实际上根本不需要使用-vawk '$2 == x' x=3awk -v x=3 '$2 == x' 完全相同
  • 嗯,不完全一样。前者不允许您在需要访问变量的地方添加 BEGIN 部​​分,而后者不允许您在文件之间更改变量的初始值。恕我直言,使用 -v 通常是您想要的。
  • 这是唯一对我有用的答案。谢谢。
【解决方案2】:

awk 有一个 -v 选项用于此目的,或者正如@nevelis 提到的,只需使用双引号:

awk -v x=3 ' $2==x {print $1} '

【讨论】:

    【解决方案3】:

    GAWK 还支持以下语法:

    awk '$2 == x {print $1}' x=3 infile
    

    一个有趣的用法是:

    awk '$2 == x {print $1}' x=3 infile1 x=10 infile2
    

    在这种情况下,x 将等于 3 用于 infile1 并等于 10 用于 infile2

    【讨论】:

      【解决方案4】:

      使用 "" - bash 不会替换单引号。

      例如:

      x=3 awk "\$2=$x{print \$1}" infile

      【讨论】:

      • 如果awk 脚本中有很多 shell 元字符,而且通常有一些,那很快就会变得很糟糕。
      • 不要这样做,它会根据您的变量设置产生许多令人讨厌的副作用。
      【解决方案5】:
      set -a    
      x=3
      awk '$2==ENVIRON["x"]{print $1}' infile
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 2023-02-22
        • 1970-01-01
        • 2014-07-18
        • 2019-01-17
        • 2018-05-09
        相关资源
        最近更新 更多