【问题标题】:AWK (igawk) @include statement failsAWK (igawk) @include 语句失败
【发布时间】:2018-10-17 17:17:24
【问题描述】:

这是我目前正在尝试使用手动编写函数定义的基本案例(可行):

igawk 'function tripleit(x) {return x*3} {print tripleit($1)}' <(echo 5)

这是一个理论上更实用的调用函数库的版本(失败):

igawk '@include $HOME/code/thefunc {print tripleit($1)}' <(echo 5)

这里是“thefunc”:

function tripleit(x){return x*3}

如果有人知道这是如何或为什么会失败,以及我如何才能让这样的事情发挥作用,那将是非常有帮助的。我喜欢 AWK,但我不会在每次需要 UDF 时都键入和重新键入它们。

我尝试创建 foo.awk: 函数 foo(){打印“Hello World”}

并按照建议调用它:

$ cat foo.awk
function foo(){print "Hello World"}
$ igawk '@include "foo.awk"; BEGIN{foo()}'
igawk:/dev/stdin:0: cannot find "foo.awk";
$ igawk '@include "$PWD/foo.awk"; BEGIN{foo()}'
$ igawk '@include "./foo.awk"; BEGIN{foo()}'
$

还没有输出。

【问题讨论】:

    标签: awk include gawk


    【解决方案1】:

    awk 不知道 shell 变量 $HOME 包含什么,@include 需要一个字符串作为它的参数。

    $ cat foo.awk
    function foo() {
        print "Hello World"
    }
    
    $ gawk '@include $PWD/foo.awk; BEGIN{foo()}'
    gawk: cmd. line:1: @include $PWD/foo.awk; BEGIN{foo()}
    gawk: cmd. line:1:          ^ syntax error
    
    $ gawk '@include "$PWD/foo.awk"; BEGIN{foo()}'
    gawk: cmd. line:1: error: can't open source file `$PWD/foo.awk' for reading (No such file or directory)
    
    $ gawk '@include "./foo.awk"; BEGIN{foo()}'
    Hello World
    

    您也可以使用 AWKPATH 而不是每次都明确提供库目录路径:

    $ echo "$AWKPATH"
    
    $ gawk '@include "foo.awk"; BEGIN{foo()}'
    Hello World
    
    $ mkdir blob
    
    $ mv foo.awk blob
    
    $ gawk '@include "foo.awk"; BEGIN{foo()}'
    gawk: cmd. line:1: error: can't open source file `foo.awk' for reading (No such file or directory)
    
    $ AWKPATH="$PWD/blob:$AWKPATH" gawk '@include "foo.awk"; BEGIN{foo()}'
    Hello World
    

    或者尝试:

    gawk -f foo.awk -f - <<<'BEGIN{foo()}'
    

    【讨论】:

      【解决方案2】:

      (把这个放在这里,以防我再次遇到这个......)

      我花了一些时间才把它弄好,但您可以将 AWKPATH(或任何其他环境变量)编码到任何脚本中,如下所示:

      #!/usr/bin/env -S AWKPATH=${HOME}/bin awk -f
      @include "utilities.awk"
      ...
      

      别忘了 chmod +x 脚本。

      棘手的部分是 -S 的手册页文档,它说

      -S, --split-string=S
      

      这似乎暗示以下(失败):

      #!/usr/bin/env -S AWKPATH=${HOME}/bin awk -f
      

      【讨论】:

        猜你喜欢
        • 2021-10-07
        • 2018-02-02
        • 2015-07-07
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2015-02-24
        • 1970-01-01
        相关资源
        最近更新 更多