【问题标题】:How to pass bash parameter to awk script?如何将bash参数传递给awk脚本?
【发布时间】:2012-01-23 14:11:50
【问题描述】:

我有 awk 文件:

#!/bin/awk -f
BEGIN {

}
{
        filetime[$'$colnumber']++;
}
END {
        for (i in filetime) {
                print filetime[i],i;
        }
}

和 bash 脚本:

#!/bin/bash
var1=$1
awk -f myawk.awk

当我跑步时:

ls -la | ./countPar.sh 5

我收到错误:

ls -la | ./countPar.sh 5
awk: myawk.awk:6:         filetime[$'$colnumber']++;
awk: myawk.awk:6:                   ^ invalid char ''' in expression

为什么? $colnumber 必须替换为 5,因此 awk 应该读取 ls 输出的第 5 列。 谢谢。

【问题讨论】:

  • 这似乎是这个问题的后续:stackoverflow.com/q/8551780/226201 正如其他人所指出的那样,bash 环境和 awk 环境是分开的,如果您想将参数从一个传递到另一个,则必须进行明确的。

标签: file bash awk


【解决方案1】:

您可以直接从命令行将变量传递给您的 awk 脚本。

改变这一行:

filetime[$'$colnumber']++;

收件人:

filetime[colnumber]++;

然后运行:

ls -al | awk -f ./myawk.awk -v colnumber=5

如果你真的想使用 bash 包装器:

#!/bin/bash
var1=$1
awk -f myawk.awk colnumber=$var1

(您的脚本中的更改与上述相同。)

如果要使用环境变量,请使用:

#!/bin/bash
export var1=$1
awk -f myawk.awk

和:

filetime[ENVIRON["var1"]]++;

(我真的不明白你的 awk 脚本的目的是什么。最后一部分可以简化为:

END { print filetime[colnumber],colnumber; }

解析ls 的输出通常是个坏主意。)

【讨论】:

  • 感觉是结合 bash 和 awk。我得到的输入参数,例如bash script比较复杂。
  • 我不确定我是否理解你,所以添加了更多选项。您不能在 awk 脚本中进行纯 shell 替换,这将不起作用 - shell 仅对其参数进行替换,而不是在您在命令行上指定的随机文件中进行替换(它甚至不检查什么是文件和一般情况下不是什么)。
  • 有趣;我不知道你可以在不使用 -v 的情况下将变量传递给 awk
  • @twqqis:参见例如here,有/没有-v的行为略有不同。
【解决方案2】:

最简单的方法:

#!/bin/bash
var=$1
awk -v colnumber="${var}" -f /your/script

但在您的 awk 脚本中,您不需要在 colnumber 前面添加 $

HTH

【讨论】:

    【解决方案3】:

    将 3 个变量传递给脚本 myscript.sh var1 是设置了条件的列号。 而 var2 & var3 是输入和临时文件。

    #!/bin/ksh
    var1=$1
    var2=$2
    var3=$3
    awk -v col="${var1}" -f awkscript.awk ${var2} > $var3
    mv ${var3} ${var2}
    

    如下执行 -

    ./myscript.sh 2 file.txt temp.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2021-11-18
      • 2012-12-29
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多