类似事情的最佳方法是什么
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循环
printf
省略换行符,但您需要使用格式字符串并自己添加换行符:
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"
}'
使用数组 A 可以
for i in $(seq 0 2 ${#A}); do
printf "%s " ${A[i]}
done | sed 's/ $/n/'