Как мне вылить содержимое SYMTAB в gawk? - PullRequest
0 голосов
/ 12 сентября 2018

Как мне вылить содержимое 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 голосов
/ 12 сентября 2018

Спасибо, Эд Мортон.Похоже, что рекурсивный процесс потребовался бы, если бы мне нужно было поддерживать произвольные уровни вложенных массивов, но сейчас этот код выводит мой 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"
               }
            }
         }
      }
   }
}

Еще раз спасибо!

0 голосов
/ 12 сентября 2018

Используйте 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 }

Массаж для костюма ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...