【问题标题】:basic understanding of variable assignment in awkawk中变量赋值的基本理解
【发布时间】:2017-08-13 19:32:57
【问题描述】:

我对 awk 使用变量赋值的方式的理解有一个非常基本的争论。在下面,我分配的变量 new 的输出是如何没有打印出来的 - 而是打印了整个记录 ($0)。我确实看过GNU user's guide,但未能理解这种非常基本的行为。感谢您的耐心等待!

echo "a b c" | awk '
{
print $NF #This prints c    
new=$NF
print $new #Why does this not print c 
}'

输出:

c
a b c

【问题讨论】:

    标签: bash awk variable-assignment


    【解决方案1】:

    要了解差异,请使用以下代码:

    echo "a b c" | awk '
    {
    print $NF #This prints c    
    new=NF
    print $new #Why does this not print c 
    }'
    

    输出:正确打印:

    c
    c
    

    当您使用new=$NF 而不是new=NF 时,您将最后一个字段的值分配给new。然后当你在print 语句中再次执行$new 时,awk 会尝试将c 转换为数字并得到0,因此它会打印整行。

    【讨论】:

    • 啊!永远不要将 $ 用于赋值右侧的变量(至少我正在尝试)。
    • @user3375672 永远不要 $ 用于赋值的 EITHER 一侧的变量。只是永远不要$ 来获取变量的内容,仅此而已,就像 C 和大多数其他基于算法的语言一样。 $ 是获取字段值的运算符,就像a[7] 获取由7 索引的数组a[] 的值一样,使用$7 获取7th 的值字段。
    【解决方案2】:

    您可以将要打印的行更新为print new;在 awk 中访问变量是 C 类型的。

    new=$NF 等同于:
    new=$3(NF 的值为 3)

    现在变量new 的值为第三列(c),您可以使用: print new

    否则,根据 @anubhava 的回答,您可以将 NF 的值分配给 new 并将其与 $ 符号一起使用以打印第 3 列。

    【讨论】:

      【解决方案3】:

      将 $ 与字符串相关联是很有诱惑力的,因为某些语言使用这种约定。此外,诸如 bash 之类的 shell 使用 $ 来检索变量值。最令人困惑的是,shell 和 awk 都使用带有数字的 $ 来解析整行中的字段。所以 $1 包含第一个字段,依此类推。但是 awk 中的变量在其他任何地方都没有使用美元符号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 2014-05-06
        • 1970-01-01
        相关资源
        最近更新 更多