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