在awk中使用bash的扩展变量

时间:2016-09-14 13:45:51

标签: bash awk

以下是我正在处理的问题的缩小版本。

我正在使用bash获取以下信息并将其存储到名为" c"的bash变量中。

echo {1..3}
1 2 3
echo \${1,2,3}
$1 $2 $3
c=$(echo \${1,2,3})
echo $c
$1 $2 $3

现在我想使用变量" c"在awk声明中,想知道它是否可能,或者我在想远离现实。

echo a b c d e f g h |awk -v c=$"(echo \${1,2,3})" '{print c}'
(echo ${1,2,3}) #This is not expected, instead a b c was. 

  echo a b c d e f g h |awk -v c="$(echo \${1,2,3})" '{print c}'
  $1 $2 $3

我知道我可以在awk中使用for循环来做到这一点。但在我的要求中,我感兴趣的列号是完全随机的,因此无法使用循环。这使得以下方式无法使用。

喜欢这个

echo a b c d e f g h |awk '{print $1,$2,$3}'
a b c

或者像这样:

 echo a b c d e f g h |awk '{for(i=1;i<=3;i++) printf "%s ", $i}'
a b c 

查询:

想知道是否可以将所有列号存储为列表/数组/变量并将它们抛出以awk格式打印?

注意:

这是原始数据的真实缩小版本。

1 个答案:

答案 0 :(得分:3)

我建议传递列号数组,如下所示:

cols=( {1..3} )
awk -v a="${cols[*]}" 'BEGIN { n = split(a, cols) } 
    { for (i = 1; i <= n; ++i) printf "%s%s", $(cols[i]), (i<n?OFS:ORS) }'

请注意,我正在使用${cols[*]},因此shell不会将数组的元素拆分为单独的单词。