2016-05-20 83 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/'