如何在awk表达式中使用变量

时间:2010-04-08 10:24:36

标签: string bash awk printf

我正在尝试制作此命令:

sed bla bla filename | awk '{printf "%s %s_entry_%.3f %.3f %.3f %.3f",$1,$3,$4,$5,$6,$7}'

但问题是,我希望%.3f部分是可变的。因此,在一种情况下,它可能是%.3f,而在另一种情况下,它可能是%。3f%.3f%.3f。因此,为了清楚起见,我将在示例代码中使用静态代码。所以如果我想要这些%.3f中的4个并将它们放在变量$值中,如下所示:

values="%.3f %.3f %.3f %.3f"

然后我怎么能把这个字符串放在awk表达式中,而不是把awk简单地放在那里“$ {values}”。以下是我的非工作尝试:

sed bla bla filename | awk '{printf "%s %s_entry_${values}",$1,$3,$4,$5,$6,$7}'

3 个答案:

答案 0 :(得分:7)

您可以使用awk的-v选项从shell传递变量

#!/bin/bash    
awk -v values="${values}" '{gsub("blah","replace");printf "%s %s_entry_"values ....}' file

gsub()函数用于替换sed命令所具有的功能。所以只需要一个awk命令。在这种情况下sed是多余的(以及使用awk的大多数其他情况)

答案 1 :(得分:2)

最容易使用实际的awk变量:

sed bla bla filename | awk -v values="$values" '{printf "%s %s_entry_"values,$1,$3,$4,$5,$6,$7}'

或者使用bash:

awk -v values="$values" '{printf "%s %s_entry_"values,$1,$3,$4,$5,$6,$7}' <(sed bla bla filename)

答案 2 :(得分:1)

如果您的意思是values是一个shell变量,那么这将起作用:

sed bla bla filename | awk '{printf "%s %s_entry_"ENVIRON["values"],$1,$3,$4,$5,$6,$7}'