打印动态字段列表

时间:2016-05-20 17:29:23

标签: bash awk

之类的事情的最佳方式是什么?
awk '{ print $1, $3, $5 }'

但是以动态的方式?

案例是要在运行时才知道要打印的最后一个字段。 所以它可能是1美元,3美元,5美元,也可能是1美元,3美元,5美元,7美元,9美元甚至更多

我的第一次试用就像:

awk -v MAX=7 '{for (i = 2; i < MAX; i+=2) {print i,$i} }'

但它会在一行中打印一个字段:

a[2]
a[4]
a[6]

而不是

a[2] a[4] a[6]

有更好的方法来实现这一目标吗?

感谢你的所有建议。 :)

一个后续问题。 在运行时,我已经有了可用的序列,比如MyArray =(2 4 6 8) 有没有办法将这个数组“传递”到awk并要求awk打印$ 2 $ 4 $ 6 $ 8? 这样我就可以在awk中保存一个for循环

2 个答案:

答案 0 :(得分:1)

使用printf省略换行符,但您需要使用format string并自行添加换行符:

awk -v MAX=7 '{
    for (i = 2; i < MAX; i+=2) {
        printf "a[%d]=%s " i, $i
    }
    printf "\n"
}'

请注意,上面的示例包含每行上一个a[N]=VAL之后的尾随空格。如果你想省略它,你可以使用类似的东西:

awk -v MAX=7 '{
    print_num = 0

    for (i = 2; i < MAX; i+=2) {
        if ( print_num++ > 0 ) { printf " " }
        printf "a[%d]=%s" i, $i
    }
    printf "\n"
}'

答案 1 :(得分:0)

使用数组A,您可以

for i in $(seq 0 2 ${#A}); do
   printf "%s " ${A[i]}
done | sed 's/ $/\n/'