for 循环中 awk 中的变量

时间:2021-05-30 20:02:20

标签: bash ubuntu variables awk

我的 bash 脚本有问题。

for b in O B A F G K M
do   
u='$n'$b  
w='$m'$b  
awk -v "j=$u" -v "h=$b" 'BEGIN{printf(" "h" stars: %6d  ", j)}'  
awk -v "i=$w" 'BEGIN{printf("%"i"s\n", "[]")}' | sed 's/ /[]/g'  
done

我需要在 awk 中使用名为“nO”和“nB”等的变量。我的老师建议在 awk 之前将这些值分配给另一个变量,但是当我这样做时,它只打印“$nO”而不是像“200”这样的值。这个怎么做?我需要这样的东西:awk -v j=$[n$b],所以 j 在第一个循环中被分配了变量 nO 的值,然后是 nB 的值。 (这些 nO 或 mO 已在前面定义。

2 个答案:

答案 0 :(得分:1)

当你有nO=200时,你可以在b=O中使用u="n$b",并得到值

awk -v "j=${!u}" -v "h=$b" 'BEGIN{printf(" "h" stars: %6d  ", j)}'

! 将查找它引用的变量。

答案 1 :(得分:0)

您也可以使用“nameref”(在 bash 4.3 中引入)

nB=Hello mB=World
letter=B

declare -n u="n$letter" w="m$letter"

awk -v j="$u" -v h="$w" 'BEGIN {print "j is " j; print "h is " h}'
j is Hello
h is World

或者,重构您的 shell 脚本以使用关联数组 (bash 4.0):

declare -A n m
n[B]=foo
m[B]=bar
letter=B

awk -v j="${n[$letter]}" -v h="${m[$letter]}" 'BEGIN {print "j is " j; print "h is " h}'