awk字符串提取不适用于变量

时间:2015-10-13 02:18:57

标签: bash unix awk

echo boy:foo:cheese | awk -F":" '{print $1}'

结果:男孩

echo boy:foo:cheese | awk -F":" '{print $2}'

结果:foo

i=1
echo boy:foo:cheese | awk -F":" '{print $($i)}'

结果:男孩:foo:奶酪

此外,

 i=1
echo boy:foo:cheese | awk -F":" '{print $i}'

结果:男孩:foo:奶酪

我希望能够打印第i个项目。发生这种情况的唯一可能原因是awk不支持其打印值的变量?我的最终目标是遍历字符串并获取: 男孩 FOO 干酪

2 个答案:

答案 0 :(得分:0)

想出来了!

echo "cat:test:cheese" | awk -F":" '{print $'$i'}'

答案 1 :(得分:0)

您似乎注意到shell变量和awk位置/字段变量共享语法$#,但未能认为这意味着awk无法扩展两者

shell会扩展shell所做的变量,而不是两者。

awk脚本周围的单引号意味着shell 所以awk会这样做。所以'{print $2}'告诉awk打印第二个字段。同样地,$1告诉awk打印第一个字段。然而,'{print $($i)}'告诉使用awk变量i,然后将该值用作位置/字段变量($<i>),然后使用 作为另一个位置/ field variable $(<$<i>>)

未初始化时,awk中的变量默认为0,因此序列为:

  1. $($i)
  2. $($0)
  3. $(input line)
  4. ``
  5. 然后导致awk尽职尽责地打印出来。

    使用shell变量的正确方法是使用-v var="$1"将其传递给awk,然后在awk中使用var。 awk中的非位置/非位置变量使用$ sigil。