AWK和全局变量

时间:2018-12-13 12:14:06

标签: bash awk

好,为什么我不能手动将值numIterations的值传递给下一个表达式,而对我有用呢?

echo "numIterations $numIterations"
(tr ' ' '\n' | sort | uniq -c | awk '{print "winner " $2 " appeared "$1 " times. Frequency is "$1*100 / $numIterations" %"}') < "final_winners.txt" > "final_output_winners.txt"

这是下面的输出:

numIterations 1000
winner 10 appeared 110 times. Frequency is 100 %
winner 11 appeared 90 times. Frequency is 100 %
...

$ 1是110,$ numIterations是1000,所以结果必须是11%,没有100%

如果我将$ numIterations替换为1000,结果就可以了。

我正在osx 10.14.1中运行bash 3.2。 谢谢。

1 个答案:

答案 0 :(得分:1)

您的变量用单引号引起来,因此不会扩展。在awk部分中,将$numIterations替换为'"$numIterations"'

更好的选择:使用awk -v ni="$numIterations"设置awk变量,并在ni脚本中使用awk。清楚的示例:

$ x=7
$ echo awk 'BEGIN {print 1 * $x}'
awk BEGIN {print 1 * $x}              # this is literally what awk sees
$ awk 'BEGIN {print 1 * $x}'
0                                     # because $x is not set in awk
$ awk -v x="$x" 'BEGIN {print 1 * x}'
7