ksh 环境中 awk 中的数组赋值
Array assignment in awk on ksh environment
我的一个 awk 脚本在 bash shell 环境中运行良好,但我发现它不适用于 ksh (AIX)。
awk: Cannot make an assignment to j. It is an array name.
我不擅长 awk 脚本,向我展示错误的部分会很有帮助,这样我就可以 运行 它在 ksh 上没有任何问题。
我还想知道我是否可以在 awk 脚本的头部定义 shell 类型,例如 bash、ksh 和 csh。有什么办法吗?
输入和完整的 awk 脚本
Job ID : 56
Status : Done - 1 object completed
ID Tablename Status Time Total Rows %Comp Total Time
------ --------------------------------------- -------------- ------------ ---------- ----- ------------
1 "TEST"."TEST"."TEST" In Good N/A 1708219 100 1:26
BEGIN {
count = 0
job_id = 0
status = 0
PROCINFO["sorted_in"] = "@ind_num_asc"
}
/^Job ID/ {
job_id =
a[job_id] = job_id "#-1#no_data#no_data#no_data#-1#-1#no_data"
count++
}
/^Status/ {
match([=11=],/[0-9]+/)
status = substr([=11=], RSTART, RLENGTH)
temp = a[job_id]
delete a[job_id]
a[job_id] = temp "#" status
}
/^[0-9]/ {
delete a[job_id]
string = job_id
step_skip = 0
for (i=1; i <= NF; i++) {
if (i == 4 || (i == 5 && step_skip == 1)) {
continue
} else if (i == 2) {
gsub(/"/, "", $i);
gsub(/\./, "#", $i);
string = string "#" $i
} else if (i == 3){
if (match($i, /^Out/)) {
string = string "#" $i " " $(i+1)
step_skip = 1
} else if (match($i, /^In/)) {
string = string "#" $i " " $(i+1)
step_skip = 1
} else if (match($i, /^Skipped/)) {
string = string "#" $i "#-1#-1#no_data"
break
} else {
string = string "#" $i
}
} else if (i == 6 || (i == 7 && step_skip == 1)) {
if (match($i, /:/)) {
string = string "#-1#" $i
} else {
string = string "#" $i
}
}else {
string = string "#" $i
}
}
a[job_id, ] = string "#" status
}
END {
for (j in a) {
if (j in a) {
print a[j]
}
temp = a[j]
if (PROCINFO["temp"] == "array") {
for (k in j) {
print a[j, k]
}
}
}
}
awk 与您的 shell 无关,反之亦然。由于 运行 不同版本的 awk 而不是从不同版本的 shell.
调用 awk 而暴露了代码中的错误,您遇到了问题
在某些 awk 中,例如 Mac OS for (k in j)
上的默认 BSD awk 出现在代码中,即使在您的情况下无法到达的腿中, 足以让 awk 将 j
识别为一个数组,因为您在其上使用数组操作 in
因此当 awk 遇到您时,您将 j
视为代码中其他地方的标量(for (j in a)
) awk 告诉你不能那样做,因为 j
是一个数组。
您的代码中还有其他问题,例如在您不是 运行 gawk 时使用像 PROCINFO[]
这样的 gawk-only 结构,并且您混淆了伪多维数组索引语法(a[i,j]
) 对只能使用 gawks arrays-of-arrays 语法 (a[i][j]
) 创建的数组进行测试,并执行 for (j in a) { if (j in a) {
之类的操作,其中 if
不能' t 可能会失败,而且 temp = a[j]; if (PROCINFO["temp"] == "array")
其中 temp
不可能是数组,否则赋值会失败。如果您需要有关代码的这些或其他方面的帮助,请随时 post 提出新问题。
我的一个 awk 脚本在 bash shell 环境中运行良好,但我发现它不适用于 ksh (AIX)。
awk: Cannot make an assignment to j. It is an array name.
我不擅长 awk 脚本,向我展示错误的部分会很有帮助,这样我就可以 运行 它在 ksh 上没有任何问题。 我还想知道我是否可以在 awk 脚本的头部定义 shell 类型,例如 bash、ksh 和 csh。有什么办法吗?
输入和完整的 awk 脚本
Job ID : 56
Status : Done - 1 object completed
ID Tablename Status Time Total Rows %Comp Total Time
------ --------------------------------------- -------------- ------------ ---------- ----- ------------
1 "TEST"."TEST"."TEST" In Good N/A 1708219 100 1:26
BEGIN {
count = 0
job_id = 0
status = 0
PROCINFO["sorted_in"] = "@ind_num_asc"
}
/^Job ID/ {
job_id =
a[job_id] = job_id "#-1#no_data#no_data#no_data#-1#-1#no_data"
count++
}
/^Status/ {
match([=11=],/[0-9]+/)
status = substr([=11=], RSTART, RLENGTH)
temp = a[job_id]
delete a[job_id]
a[job_id] = temp "#" status
}
/^[0-9]/ {
delete a[job_id]
string = job_id
step_skip = 0
for (i=1; i <= NF; i++) {
if (i == 4 || (i == 5 && step_skip == 1)) {
continue
} else if (i == 2) {
gsub(/"/, "", $i);
gsub(/\./, "#", $i);
string = string "#" $i
} else if (i == 3){
if (match($i, /^Out/)) {
string = string "#" $i " " $(i+1)
step_skip = 1
} else if (match($i, /^In/)) {
string = string "#" $i " " $(i+1)
step_skip = 1
} else if (match($i, /^Skipped/)) {
string = string "#" $i "#-1#-1#no_data"
break
} else {
string = string "#" $i
}
} else if (i == 6 || (i == 7 && step_skip == 1)) {
if (match($i, /:/)) {
string = string "#-1#" $i
} else {
string = string "#" $i
}
}else {
string = string "#" $i
}
}
a[job_id, ] = string "#" status
}
END {
for (j in a) {
if (j in a) {
print a[j]
}
temp = a[j]
if (PROCINFO["temp"] == "array") {
for (k in j) {
print a[j, k]
}
}
}
}
awk 与您的 shell 无关,反之亦然。由于 运行 不同版本的 awk 而不是从不同版本的 shell.
调用 awk 而暴露了代码中的错误,您遇到了问题在某些 awk 中,例如 Mac OS for (k in j)
上的默认 BSD awk 出现在代码中,即使在您的情况下无法到达的腿中, 足以让 awk 将 j
识别为一个数组,因为您在其上使用数组操作 in
因此当 awk 遇到您时,您将 j
视为代码中其他地方的标量(for (j in a)
) awk 告诉你不能那样做,因为 j
是一个数组。
您的代码中还有其他问题,例如在您不是 运行 gawk 时使用像 PROCINFO[]
这样的 gawk-only 结构,并且您混淆了伪多维数组索引语法(a[i,j]
) 对只能使用 gawks arrays-of-arrays 语法 (a[i][j]
) 创建的数组进行测试,并执行 for (j in a) { if (j in a) {
之类的操作,其中 if
不能' t 可能会失败,而且 temp = a[j]; if (PROCINFO["temp"] == "array")
其中 temp
不可能是数组,否则赋值会失败。如果您需要有关代码的这些或其他方面的帮助,请随时 post 提出新问题。