如何在gawk中转储SYMTAB的内容?

如何在gawk中转储SYMTAB的内容?,awk,Awk,如何在gawk中转储SYMTAB的内容?我已经尝试过下面这样的方法,可以很好地显示标量。它还显示数组名称和索引,但不显示每个数组元素的值 for (i in SYMTAB) { if (isarray(SYMTAB[i])) { for (j in SYMTAB[i]) { printf "%s[%s] = %s\r\n", i, j, SYMTAB[i, j] } } else { printf "%s = %s\r\n", i, SY

如何在gawk中转储SYMTAB的内容?我已经尝试过下面这样的方法,可以很好地显示标量。它还显示数组名称和索引,但不显示每个数组元素的值

for (i in SYMTAB) {
   if (isarray(SYMTAB[i])) {
     for (j in SYMTAB[i]) {
        printf "%s[%s] = %s\r\n", i, j, SYMTAB[i, j]
     }
   } else {
     printf "%s = %s\r\n", i, SYMTAB[i]
   }
}
结果如下:

OFS =  
ARGC = 1
PREC = 53
ARGIND = 0
ERRNO = 
ARGV[0] = 

例如,我希望在
ARGV[0]
之后看到一个值,但我没有看到。

使用
SYMTAB[I][j]
而不是
SYMTAB[I,j]
-在循环中使用多维数组语法来访问索引,所以请继续这样做

下面是一个递归函数,用于转储SYMTAB或任何其他数组或标量:

$ cat tst.awk
function dump(name,val, i) {
   if ( isarray(val) ) {
        printf "%*s%s %s%s", indent, "", name, "{", ORS
        indent += 3
        for (i in val) {
            dump(i,val[i])
        }
        indent -= 3
        printf "%*s%s %s%s", indent, "", name, "}", ORS
   }
   else {
        printf "%*s%s = <%s>%s", indent, "", name, val, ORS
   }
}

BEGIN {
    dump("SYMTAB",SYMTAB)
}
$cat tst.awk
函数转储(名称、值、i){
if(isarray(val)){
printf“%*s%s%s%s”,缩进“,”名称“{”,或
缩进+=3
用于(val中的i){
转储(i,val[i])
}
缩进-=3
printf“%*s%s%s%s”,缩进“,”名称“}”,或
}
否则{
printf“%*s%s=%s”、缩进“、名称、val、ORS
}
}
开始{
转储(“SYMTAB”,SYMTAB)
}

$awk-f tst.awk
符号表{
ARGV{
0 = 
ARGV}
圆形模式=
ORS=<
>
OFS=<>
皮棉=
FNR=
错误号=
NR=
忽略案例=
TEXTDOMAIN=
NF=
精氨酸=
缩进=
ARGC=
PROCINFO{
argv{
0 = 
1 = 
2 = 
argv}
第9组=
ppid=
...
strftime=
第8组=
PROCINFO}
字段宽度=
CONVFMT=
子集=
PREC=
环境{
SHLVL=
环境=
...
INFOPATH=
温度=
程序数据=
环境}
卢比=<
>
FPAT=
RT=
RLENGTH=
OFMT=
FS=<>
RSTART=
文件名=
BINMODE=
SYMTAB}

按摩适合…

谢谢Ed Morton。如果我需要支持任意级别的嵌套数组,似乎需要一个递归过程,但现在这段代码转储了我的gawk SYMTAB,没有错误:

for (i in SYMTAB) {
   if (!isarray(SYMTAB[i])) {
      printf "%s = %s\r\n", i, SYMTAB[i]
   } else {
      for (j in SYMTAB[i]) {
         if (!isarray(SYMTAB[i][j])) {
            printf "%s[%s] = %s\r\n", i, j, SYMTAB[i][j]
         } else {
            for (k in SYMTAB[i][j]) {
               if (!isarray(SYMTAB[i][j][k])) {
                  printf "%s[%s][%s] = %s\r\n", i, j, k, SYMTAB[i][j][k]
               } else {
                  printf "Skipping highly nested array.\r\n"
               }
            }
         }
      }
   }
}

再次感谢

谢谢大家!!在代码命中PROCINFO[“argv”]:
fatal:尝试在标量上下文中使用array
PROCINFO[“argv”]”之前,这一切都很正常。我将尝试使用isarray()检测此类问题。我在答案中添加了递归版本,请参阅
for (i in SYMTAB) {
   if (!isarray(SYMTAB[i])) {
      printf "%s = %s\r\n", i, SYMTAB[i]
   } else {
      for (j in SYMTAB[i]) {
         if (!isarray(SYMTAB[i][j])) {
            printf "%s[%s] = %s\r\n", i, j, SYMTAB[i][j]
         } else {
            for (k in SYMTAB[i][j]) {
               if (!isarray(SYMTAB[i][j][k])) {
                  printf "%s[%s][%s] = %s\r\n", i, j, k, SYMTAB[i][j][k]
               } else {
                  printf "Skipping highly nested array.\r\n"
               }
            }
         }
      }
   }
}