2013-02-10 52 views
0

采样功能:awk中如何传递参数的功能,从内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中的函数?

+0

第二个块中的awk示例仅打印“某物bla bla2”,它不打印“something”的第一行。这是一个错字还是别的吗?这是什么操作系统,你使用的是什么版本的awk/gawk? – slm 2013-02-10 06:45:06

+0

错字,纠正它。它是RHEL5。 – hellish 2013-02-10 18:44:46

回答

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

+0

谢谢!如果我找不到其他方法来实现我想要的功能,则必须尝试此解决方法。 – hellish 2013-02-10 19:24:39

+0

嘿,但这个执行功能和显示输出,我试图实现的是取代拳头元素,然后打印整个修改后的行。 $回声“什么...“| awk'{$ 1 = system(”./ yourfunction.sh“FS $ 1); print;}' 什么世界 0; ...我期待这里的结果是一行:”什么世界.. 。“ – hellish 2013-02-10 23:24:18

+0

@hellish:请参阅我上面编辑的编辑器HTH。 – Steve 2013-02-10 23:53:05

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 

现在,告诉我们你真的是在努力做的,我们可以帮你写一个健全的脚本来做到这一点。

+0

尽你所能描述了一切但是出错: BASH_ENV = .env $ echo“something bla bla2”| awk'$ 1〜/ something/{“bash -c \”testfn“$ 1” \“”| getline $ 1; print $ 0}' sh:-c:line 0:寻找匹配的意外EOF''' sh:-c:第一行:语法错误:文件意外结束 bla bla2 我向awk发送一个值表。我想要的是根据第1列中的元素替换第5列中的一个字段,并且应该通过复杂函数(基于来自数据库的SQL查询结果)处理此元素。 – hellish 2013-02-10 18:58:17

+0

也许你的外壳不是bash和/或bash不可用在你的盒子上?只需使用通常使用的任何shell,并在启动新的非登录shell时执行shell的任何文件。无论如何你不应该这样做。不幸的是,您的解释并不包含足够的信息来帮助您编写脚本。如果您需要帮助,请使用示例输入/输出编辑您的问题,并描述您的功能应该执行的操作。 – 2013-02-10 19:43:01