需要优秀bash程序员的帮助吗

需要优秀bash程序员的帮助吗,bash,awk,Bash,Awk,我在下面有这个脚本 #!/bin/bash function labels2 () { awk ' /[0-9]/{ print substr($3,length($3)-11), $3 }' $@ | /bin/sort -u | awk '{print "BUILD: " NR, $2}' } function labels () { awk ' /[0-9]/{ BL[$3] = substr($3,length($3)-11)

我在下面有这个脚本

#!/bin/bash
function labels2 () {
    awk '
    /[0-9]/{
    print substr($3,length($3)-11), $3
    }' $@ | /bin/sort -u  | awk '{print "BUILD: " NR, $2}'
}

function labels () {
    awk '
    /[0-9]/{
    BL[$3] = substr($3,length($3)-11)
    }
    END {
    asort(BL)
    for (i in BL) {
        print i, BL[i]
    }
    }' $@
}


labels $@

for a in $@
do
    labels $@ | gawk '
    /BUILD:/ {
    BUILD[$2] = $3
    BUILDCNT ++
    next
    }
    /[0-9]/ {
    DATEd[$3] = $1
    TIMEd[$3] = $2
    MODULESd[$3] = $4
    CASESd[$3] = $5
    FAILEDd[$3] = $6
    COVERd[$3] = $7
    LOCd[$3] = $8
    }
    END {
    SUBSYSTEM=substr(FILENAME, 1, length(FILENAME)-7)
    LABEL= "\"" toupper(SUBSYSTEM) "\""

    print  "#{"
        print "\"buildnames\": {"
        print "        \"label\": \"buildnames\","
        print "        \"data\": ["

        print "        ]"
        print " }"
        print "};"
        print "#{"
        print "\"subsystem\": " LABEL ","
        print "    \"date\": {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (DATEd[B]) { print "            [" i ", \"" DATEd[B] "\"],"}
        }
        print "        ]"
        print "    },"
        print " \"time\" : {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (TIMEd[B]) { print "            [" i ", \"" TIMEd[B] "\"],"}
        }
        print "        ]"
        print "    },"
        print " \"modules\" : {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (MODULESd[B]) { print "            [" i ", \"" MODULESd[B] "\"],"}
        }
        print "        ]"
        print "    },"
        print " \"cases\" : {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (MODULESd[B]) { print "            [" i ", \"" MODULESd[B] "\"],"}
        }
        print "        ]"
        print "    },"
        print " \"failed\" : {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (FAILEDd[B]) { print "            [" i ", \"" FAILEDd[B] "\"],"}
        }
        print "        ]"
        print "    },"
        print " \"cover\" : {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (COVERd[B]) { print "            [" i ", \"" COVERd[B] "\"],"}
        }
        print "        ]"
        print "    },"
        print " \"loc\" : {"
        print "        \"label\": " LABEL ","
        print "        \"data\": ["
        for (i = 0 ; i <= BUILDCNT; i ++ ) {
            B=BUILD[i]
            if (LOCd[B]) { print "            [" i ", \"" LOCd[B] "\"],"}
        }
        print "        ]"
        print "    }"
        print "    };"
    }
    ' - $a
done
我想要的是这个样子

#{
"buildnames": {
        "label": "buildnames",
        "data": [[0,"BUILD: 1 P16A22_110114072915"]
        ]
        }
};
#{
"subsystem": "GPS",
    "date": {
        "label": "GPS",
        "data": [
            [0, "2011-01-22"],
        ]
    },
        "time" : {
        "label": "GPS",
        "data": [
            [0, "22:12"],
        ]
    },
        "modules" : {
        "label": "GPS",
        "data": [[0,22]
        ]
    },
        "cases" : {
        "label": "GPS",
        "data": [[0,1312]
        ]
    },
        "failed" : {
        "label": "GPS",
        "data": [[0,75]
        ]
    },
        "cover" : {
        "label": "GPS",
        "data": [[0,13.55]
        ]
    },
        "loc" : {
        "label": "GPS",
        "data": [[0,1399]
        ]
    }
    };
所以把这些问题分解成子问题

  • 为什么行
    110114072915
    在顶部,我如何删除它

  • 我如何使用函数
    labels2()
    ,以便它的输出
    (BUILD:1 P16A22_110114072915)
    像这样进入
    buildnames

    "buildnames": {
        "label": "buildnames",
        "data": [[0,"**BUILD: 1 P16A22_110114072915**"]
        ]
        }
    
  • 这是最后一个问题:
    modules[$3]=$4
    CASESd[$3]=$5
    等等,为什么不这样做呢。。。当我循环通过它并打印出来时,它就什么都没有了

  • 请注意这里的文本文件
    gps.txt
    将不断扩展,因此将来可能会有50行,如果解决方案仍然有效,那就好了=)

    我知道这变成了一大堆文字,对此我深表歉意,我可能无法回答我所有的问题,但如果你知道如何回答这些问题,我会非常高兴,因为我现在陷入困境,不知道如何做我想做的事。不幸的是,这样做是我唯一的选择


    谢谢你的努力=)

    这都是基于心理处理的——我还没有实际运行这些命令。查看该文本文件的示例会有所帮助

    1) 为什么第110114072915行位于顶部,如何删除它

    它看起来像是循环打印信息之前的裸
    labels$@
    调用。把它扔掉

    2) 您可能应该将该逻辑迁移到底部的awk命令中。关联数组赋值可以在第二个块
    /[0-9]/
    中完成,
    END
    逻辑可以直接放在大脚本的
    END
    块中


    3) 文本文件每行有8个字段吗?作为调试,使用类似于“/dev/stderr”的
    print NF>”以确保在设置变量时确实有8个字段。

    这都是基于心理处理的——我还没有实际运行这些命令。查看该文本文件的示例会有所帮助

    1) 为什么第110114072915行位于顶部,如何删除它

    它看起来像是循环打印信息之前的裸
    labels$@
    调用。把它扔掉

    2) 您可能应该将该逻辑迁移到底部的awk命令中。关联数组赋值可以在第二个块
    /[0-9]/
    中完成,
    END
    逻辑可以直接放在大脚本的
    END
    块中

    3) 文本文件每行有8个字段吗?作为调试,使用类似于“/dev/stderr”的
    print NF>”
    以确保在设置变量时确实有8个字段

    1) 为什么第110114072915行位于顶部,如何删除它

    福巴正确地回答了这个问题

    这在我看来是错误的:

    for a in $@
    do
    labels $@ | gawk '
    
    为什么要在所有参数上循环,然后运行
    labels$@
    而不是
    labels$a

    2) 如何使用函数labels2()

    我将运行函数并将输出分配给awk变量:

    labels $@ | gawk -v "bnames=\"$(labels $a)\"" '
    
    然后在awk脚本中使用该变量:

        print "        \"data\": [", bnames
    
    3) 这是最后一个问题:为什么这不起作用

    我不知道,但除非你把问题分解成更小的部分并自己调试,否则你永远也无法解决它。如果你写了一个100行的awk脚本,但它不起作用,那么答案是试着用一个更简单的10行版本来工作,然后一块一块地增加它,并检查每个部分的工作情况

    1) 为什么第110114072915行位于顶部,如何删除它

    福巴正确地回答了这个问题

    这在我看来是错误的:

    for a in $@
    do
    labels $@ | gawk '
    
    为什么要在所有参数上循环,然后运行
    labels$@
    而不是
    labels$a

    2) 如何使用函数labels2()

    我将运行函数并将输出分配给awk变量:

    labels $@ | gawk -v "bnames=\"$(labels $a)\"" '
    
    然后在awk脚本中使用该变量:

        print "        \"data\": [", bnames
    
    3) 这是最后一个问题:为什么这不起作用


    我不知道,但除非你把问题分解成更小的部分并自己调试,否则你永远也无法解决它。如果你写了一个100行的awk脚本,但它不起作用,那么答案是试着用一个更简单的10行版本来工作,然后一块一块地增加它,并检查每个部分的工作情况

    我几乎不知道你在问什么。我正在尝试使用bash脚本将结构“Date Time Build Module cases failed cover loc”上的文本文件转换为JSON,但是遇到了麻烦这是一个非常具体的问题,因为有这么多的文本,而且几乎没有关于
    gps.txt
    的知识,所以很难判断这里出了什么问题。我建议你把这个程序分成几个部分,看看你的各个功能是否正常工作。这是一个很长的调试过程,您必须自己完成。:)感谢您提供的提示,我们将把它分解为子问题=)您需要向我们展示如何捕获输出。向我们展示如何调用脚本。这很重要,因为您的“垃圾”可能在STDERR上,而不是STDOUT上。您是否尝试过
    您的_script.sh/dev/null
    ?我几乎不知道您在问什么。我正在尝试使用bash脚本将结构“Date Time Build Module cases failed cover loc”上的文本文件转换为JSON,但是遇到了麻烦这是一个非常具体的问题,因为有这么多的文本,而且几乎没有关于
    gps.txt
    的知识,所以很难判断这里出了什么问题。我建议你把这个程序分成几个部分,看看你的各个功能是否正常工作。这是一个很长的调试过程,您必须自己完成。:)感谢您提供的提示,我们将把它分解为子问题=)您需要向我们展示如何捕获输出。让我们看看你是怎么做的