示例功能:
$ 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中的函数?
答案 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