0

示例功能:

$ 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 内部的函数?

4

2 回答 2

2

非常不推荐,但是:

$ 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

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

于 2013-02-10T14:06:08.887 回答
1

不 - 你不能从awk. 它不是贝壳。但是,一种常见的解决方法是将您的函数添加到文件中并使用 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

于 2013-02-10T08:16:02.987 回答