【问题标题】: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")
      

      【讨论】:

        猜你喜欢
        • 2016-03-19
        • 2021-11-20
        • 2019-03-27
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多