awk如何将函数传递给函数,从awk内部调用

时间:2013-02-10 05:52:00

标签: bash awk

示例功能:

$ testfn() { echo "${1} world"; }
$ testfn hello
hello world

awk示例:

$ echo "something bla bla2"|awk '$1 ~/something/ { print $0; }'
something bla bla2

现在我想通过将第一个awk“列元素”作为参数传递,使用上面创建的函数将“某些东西”更改为“某个世界”,将其打印为整行:

$ echo "something bla bla2"|awk '$1 ~/something/ { $1="'"$(testfn) $1"'" ; print $0 }'
 world  bla bla2

^^上面不起作用

有没有办法将参数从awk传递到awk中的函数?

2 个答案:

答案 0 :(得分:1)

非常不推荐但是:

$ cat .env
testfn() { echo "${1} world"; }
$ echo $BASH_ENV
.env
$ echo "something bla bla2" | awk '$1 ~/something/{"bash -c \"testfn " $1 "\"" | getline $1; print $0}'
something world bla bla2

现在,告诉我们你真正想要做什么,我们可以帮助你写一个理智的脚本来做到这一点。

答案 1 :(得分:0)

不 - 您无法从awk内部调用shell函数。它不是一个壳。但是,常见的解决方法是将函数添加到文件并使用awk的system()函数调用它。这是一个简单的例子:

yourfunction.sh的内容:

{
    echo "$1 world"
}

然后运行:

echo "what the ..." | awk '{ system("./yourfunction.sh" FS $1) }'

结果:

what world

请注意,如果您发现自己必须这样做,那几乎肯定是一种更好的方法。你实际试图在这做什么?


编辑:

在回答以下评论时,请使用getline()功能:

echo "what the ..." | awk '{ "./yourfunction.sh" FS $1 | getline $1 }1'

结果:

what world the ...

以下是getline()函数的一些信息:

http://www.gnu.org/software/gawk/manual/html_node/Getline.html