以下是我正在处理的问题的缩小版本。
我正在使用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格式打印?
这是原始数据的真实缩小版本。
答案 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不会将数组的元素拆分为单独的单词。