【问题标题】:Pass variable in awk inside command substitution [duplicate]在命令替换中的 awk 中传递变量 [重复]
【发布时间】:2014-09-23 09:37:22
【问题描述】:
我是新手,正在学习如何获取变量。如何在命令替换中获取打印可变部分?谢谢。
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
【问题讨论】:
标签:
bash
variables
awk
command-substitution
【解决方案1】:
问题是双重的。首先,bash 不会扩展单引号中的变量,因此$parts 被逐字传递给awk。您应该改用双引号。然而,这带来了一个不同的问题。 Bash 正在扩展变量之前调用awk:
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)
【解决方案2】:
将bash 变量与-v 一起传递。
另外,您可以让awk 为您计算文件中的行数 - 它会知道在NR 变量的末尾...
awk -v p=$parts 'END{print int(NR/p)}' file
【解决方案3】:
试试:
LINES=$(wc -l $filename | awk -v PART=$parts '{print $1/PART}' OFMT="%0.0f")