2016-05-20 84 views
-1

什么是做这样的事情awk的动态字段列表打印

awk '{ print $1, $3, $5 }' 

但在一个动态的方式最好?

这种情况是,只有在运行时才知道打印的最后一个字段。 所以它可能是$ 30,$ 90,$ 5,它也可能是$ 30,$ 90,$ 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? 这样我还能再救一个for循环中的awk

+3

你应该避免编辑的问题,他们已经回答后,特别是增加新的或不同的要求。这使得它成为一个*不同的问题,所以只要问一个新问题。如果您觉得这很重要,请参考新问题中的原始问题。原因是:当答案与问题无关时,对于未来的读者来说是令人困惑的。 – rici

+0

感谢您的提示。将不会再这样做。 – Solti

回答

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" 
}' 
+0

谢谢拉马先生。这绝对是一个好的解决方案候选人。有一个后续问题,我刚刚编辑,想知道是否有一种方法来保存这个for循环。 :) – Solti

+0

我同意@rici您的编辑应该可能是一个单独的问题,但为了您的方便,该问题已经得到解答:http://stackoverflow.com/q/5400228/477563 –

0

有了一个数组,你可以做

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