在awk里面传递变量命令替换

时间:2014-09-23 09:37:22

标签: bash variables awk command-substitution

我是新手,正在学习如何获取变量。如何在命令替换中获得打印变量部分?感谢。

echo "Enter number of parts:"
read parts
echo "Enter filename:"
read filename

LINES=$(wc -l $filename | awk '{print $1/$parts}' OFMT="%0.0f")

echo $LINES

3 个答案:

答案 0 :(得分:3)

问题是双重的。首先,bash不会在单引号中扩展变量,因此$parts按字面意思传递给awk。你应该使用双引号。然而,这带来了另一个问题。在调用awk之前,Bash正在扩展变量

LINES=$(wc -l $filename | awk "{print $1/$parts}" OFMT="%0.0f")
                                      -- ------
                                       |    |-> $parts as defined in
                                       |         your script
                                       |------> $1, the first positional 
                                                parameter of your bash script.

因此,为了使用文件的实际第一个字段,您需要转义$1

LINES=$(wc -l $filename | awk '{print \$1/$parts}' OFMT="%0.0f")

或者将变量明确地传递给awk:

LINES=$(wc -l $filename | awk '{print $1/parts}' OFMT="%0.0f" parts=$parts)

答案 1 :(得分:2)

bash变量传递给-v

另外,您可以让awk为您计算文件中的行数 - 它会在NR变量的末尾知道......

awk -v p=$parts 'END{print int(NR/p)}' file

答案 2 :(得分:1)

尝试:

LINES=$(wc -l $filename | awk -v PART=$parts '{print $1/PART}' OFMT="%0.0f")