AWK (igawk) @include 语句失败

AWK (igawk) @include statement fails

这是我目前正在尝试的基本案例,其中包含手动编写的函数定义(有效):

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

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

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

这是"thefunc":

function tripleit(x){return x*3}

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

我尝试创建 foo.awk: 函数 foo(){print "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 不知道 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()}'

(把这个放在这里以防我 运行 再次进入这个...)

我费了好大劲才弄好这个,但您可以像这样将 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