如何在gawk中转储SYMTAB的内容?
如何在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
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"
}
}
}
}
}
}