Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWK-将字符串作为命令执行?_Awk - Fatal编程技术网

AWK-将字符串作为命令执行?

AWK-将字符串作为命令执行?,awk,Awk,此命令打印: $ echo "123456789" | awk '{ print substr ($1,1,4) }' 1234 是否可以将字符串作为命令执行?例如,此命令: echo "123456789" | awk '{a="substr"; print a ($1,1,4) }' 结果: $ echo "123456789" | awk '{a="substr"; print a ($1,1,4) }' awk: {a="substr"; print a ($1,1,4) } awk

此命令打印:

$ echo "123456789" | awk '{ print substr ($1,1,4) }'
1234
是否可以将字符串作为命令执行?例如,此命令:

echo "123456789" | awk '{a="substr"; print a ($1,1,4) }'
结果:

$ echo "123456789" | awk '{a="substr"; print a ($1,1,4) }'
awk: {a="substr"; print a ($1,1,4) }
awk:                               ^ syntax error
编辑:

$ cat tst.awk 
function my_substr(x,y,z) { return substr(x,y,z) }

{ a="my_substr"; print @a($1,1,4) }
bolek@bolek-desktop:~/Pulpit$ echo "123456789" | gawk -f tst.awk
gawk: tst.awk:3: { a="my_substr"; print @a($1,1,4) }
gawk: tst.awk:3:                        ^ nieprawidłowy znak '@' w wyrażeniu
bolek@bolek-desktop:~/Pulpit$ 

我不认为直接在awk中实现这一点是可能的,但是使用shell可以获得类似的效果。回想一下,awk程序是以字符串的形式给出的,字符串在shell中是通过相邻写入来连接的。因此,您可以这样做:

a=substr
echo "123456789" | awk '{ print '"$a"'($1, 1, 4) }'

导致
1234

我认为在awk中不可能直接这样做,但是使用shell可以获得类似的效果。回想一下,awk程序是以字符串的形式给出的,字符串在shell中是通过相邻写入来连接的。因此,您可以这样做:

a=substr
echo "123456789" | awk '{ print '"$a"'($1, 1, 4) }'

导致
1234

您可以使用间接函数调用通过GNU awk中的变量调用用户定义的函数,请参阅

不幸的是,由于内部实现问题,如果希望以这种方式调用内置函数,则需要为每个函数编写一个包装器:

$ cat tst.awk
function my_substr(x,y,z) { return substr(x,y,z) }

{ a="my_substr"; print @a($1,1,4) }
$ echo "123456789" | gawk -f tst.awk
1234

您可以使用间接函数调用通过GNU awk中的变量调用用户定义的函数,请参阅

不幸的是,由于内部实现问题,如果希望以这种方式调用内置函数,则需要为每个函数编写一个包装器:

$ cat tst.awk
function my_substr(x,y,z) { return substr(x,y,z) }

{ a="my_substr"; print @a($1,1,4) }
$ echo "123456789" | gawk -f tst.awk
1234

您知道POSIX awk有类似的功能吗?不,POSIX awk没有类似的功能。@Ed Morton,最后一个示例不起作用。你可以再查一遍吗?谢谢。当我第一次复制/粘贴命令时,无需再次检查。如果你告诉我们它在什么方面对你“不起作用”,也许我们可以帮助你。你可能正在使用一个旧版本的gawk。gawk——版本告诉你什么?我使用的是4.0.0。你知道POSIX awk有类似的功能吗?没有,POSIX awk没有类似的功能。@Ed Morton,最后一个示例不起作用。你可以再查一遍吗?谢谢。当我第一次复制/粘贴命令时,无需再次检查。如果你告诉我们它在什么方面对你“不起作用”,也许我们可以帮助你。你可能正在使用一个旧版本的gawk。gawk——版本告诉你什么?我使用的是4.0.0。定义一个泛型函数,比如说,迭代数组的所有元素,并对每个元素执行一些操作X,其中X随调用而变化,并且能够为X指定函数名,这是一件非常常见的事情,这样可以避免编写一系列“if”或switch语句(gawk)定义一个泛型函数是一件非常常见的事情,比如说,迭代数组的所有元素,并对每个元素执行一些操作X,其中X随调用而变化,并且能够为X指定函数名可以避免编写一系列“if”或switch语句(gawk)。