如何将SYMTAB的内容转储到gawk中?

时间:2018-09-12 18:32:18

标签: awk

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

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]之后的值,但我没有看到。

2 个答案:

答案 0 :(得分:2)

使用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)
}

$ awk -f tst.awk
SYMTAB {
   ARGV {
      0 = <awk>
   ARGV }
   ROUNDMODE = <N>
   ORS = <
>
   OFS = < >
   LINT = <0>
   FNR = <0>
   ERRNO = <>
   NR = <0>
   IGNORECASE = <0>
   TEXTDOMAIN = <messages>
   NF = <0>
   ARGIND = <0>
   indent = <3>
   ARGC = <1>
   PROCINFO {
      argv {
         0 = <awk>
         1 = <-f>
         2 = <tst.awk>
      argv }
      group9 = <15>
      ppid = <2212>
      ...
      strftime = <%a %b %e %H:%M:%S %Z %Y>
      group8 = <11>
   PROCINFO }
   FIELDWIDTHS = <>
   CONVFMT = <%.6g>
   SUBSEP = <>
   PREC = <53>
   ENVIRON {
      SHLVL = <1>
      ENV = <.env>
      ...
      INFOPATH = </usr/local/info:/usr/share/info:/usr/info>
      TEMP = </tmp>
      ProgramData = <C:\ProgramData>
   ENVIRON }
   RS = <
>
   FPAT = <[^[:space:]]+>
   RT = <>
   RLENGTH = <0>
   OFMT = <%.6g>
   FS = < >
   RSTART = <0>
   FILENAME = <>
   BINMODE = <0>
SYMTAB }

适合的按摩...

答案 1 :(得分:0)

谢谢埃德·莫顿。如果我需要支持任意级别的嵌套数组,似乎需要一个递归过程,但是现在此代码转储了我的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"
               }
            }
         }
      }
   }
}

再次感谢!