Ошибка AWK (igawk) @include - PullRequest
       28

Ошибка AWK (igawk) @include

0 голосов
/ 07 мая 2018

Вот то, что я сейчас пытаюсь использовать в качестве базового варианта с определением функции, написанным вручную (что работает):

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: function 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()}'
$

Нет данных.

1 Ответ

0 голосов
/ 08 мая 2018

awk не знает, что содержит переменная оболочки $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()}'
...