【问题标题】:Variables in awk inside a for loop [closed]for循环内的awk中的变量[关闭]
【发布时间】:2021-08-18 06:20:32
【问题描述】:

我的 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 已经在前面定义过。

【问题讨论】:

  • 定义在哪里? How to create a Minimal, Reproducible Example。似乎这根本与 awk 无关:nOshell 变量吗?
  • 假设它只是存在,我之前定义了nO,nB,nA等变量,现在我只想在awk中使用它们

标签: bash ubuntu variables awk


【解决方案1】:

您也可以使用“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}'

【讨论】:

    【解决方案2】:

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

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

    ! 将查找它引用的变量。

    【讨论】:

    猜你喜欢
    • 2015-07-18
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2022-01-17
    相关资源
    最近更新 更多