ksh环境中awk中的数组分配

问题描述 投票:0回答:1

我的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 = $4 
    a[job_id] = job_id "#-1#no_data#no_data#no_data#-1#-1#no_data"
    count++
}

/^Status/ {
   match($0,/[0-9]+/)
   status = substr($0, 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, $1] = 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 ksh
1个回答
0
投票

[在某些awk中,例如代码中存在Mac OS for (k in j)上的默认BSD awk,即使在您无法到达的分支中,也足以使awk识别j为数组,因为您要在其上使用数组操作in,因此当awk遇到时,您会将j当作标量(for (j in a))中的标量来对待,因此awk告诉您您不能这样做,因为j为数组。

[您的代码中还有其他问题,例如在不运行gawk且将伪多维数组索引语法(PROCINFO[])与数组测试混合时使用仅gawk的结构,例如a[i,j]只能使用gawks arrays-of-arrays语法(a[i][j])进行创建,并且执行for (j in a) { if (j in a) {不可能失败的if以及temp = a[j]; if (PROCINFO["temp"] == "array")不可能失败的temp数组或分配将失败。如果您想在代码的这些方面或其他方面寻求帮助,请随时发布新问题。

© www.soinside.com 2019 - 2024. All rights reserved.