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

时间:2012-12-06 11:58:58

标签: 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$ 

2 个答案:

答案 0 :(得分:4)

我认为不可能直接在awk中执行此操作,但您可以通过使用shell获得类似的效果。回想一下awk程序是作为一个字符串给出的,并且字符串在shell中连接起来只是将它们彼此相邻。因此,您可以这样做:

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

产生1234

答案 1 :(得分:4)

您可以使用间接函数调用通过GNU awk中的变量调用用户定义的函数,请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Indirect-Calls

$ cat tst.awk
function foo() { print "foo() called" }
function bar() { print "bar() called" }

BEGIN {
   the_func = "foo"
   @the_func()

   the_func = "bar"
   @the_func()
}
$ gawk -f tst.awk
foo() called
bar() called

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

$ 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