Нужна помощь от хороших программистов Bash - PullRequest
1 голос
/ 29 июня 2011

У меня есть этот скрипт ниже

#!/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

И это дает следующий вывод при "подаче" с текущим текстовым файлом gps.txt

2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399
_




1 110114072915
#{
"buildnames": {
        "label": "buildnames",
        "data": [
        ]
        }
};
#{
"subsystem": "GPS",
    "date": {
        "label": "GPS",
        "data": [
            [0, "1"],
        ]
    },
        "time" : {
        "label": "GPS",
        "data": [
            [0, "110114072915"],
        ]
    },
        "modules" : {
        "label": "GPS",
        "data": [
        ]
    },
        "cases" : {
        "label": "GPS",
        "data": [
        ]
    },
        "failed" : {
        "label": "GPS",
        "data": [
        ]
    },
        "cover" : {
        "label": "GPS",
        "data": [
        ]
    },
        "loc" : {
        "label": "GPS",
        "data": [
        ]
    }
    };

Как я хочу выглядеть, это

#{
"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]
        ]
    }
    };

Итак, чтобы разбить эту проблему на подзадачи

  1. Почему строка 1 110114072915 вверху и как ее удалить?

  2. Как я могу использовать функцию labels2(), чтобы выход из нее (BUILD: 1 P16A22_110114072915) получал buildnames вот так

    "buildnames": {
        "label": "buildnames",
        "data": [[0,"**BUILD: 1 P16A22_110114072915**"]
        ]
        }
    
  3. Это последний вопрос: почему бы не сработать MODULESd[$3] = $4, CASESd[$3] = $5 и т. Д. ... когда я перебираю его и распечатываю, он становится ничем.

Обратите внимание здесь, что текстовый файл gps.txt будет непрерывно расширяться, так что в будущем это может быть 50 строк, и было бы хорошо, если бы решение все еще работало =)

Я знаю, что это стало большим количеством текста, и я прошу прощения за это, и я, возможно, не получу ответы на все мои вопросы, но если бы у вас была идея, как получить любой из тех, я был бы более чем счастлив, потому что я Я застрял и не знаю, как делать то, что я хочу. И, к сожалению, этот способ - мой единственный вариант.

Спасибо вам за ваши усилия =)

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Все это основано на умственной обработке - на самом деле я еще не запускал команды. Это поможет увидеть образец этого текстового файла

1) Почему строка 1 110114072915 находится сверху и как ее удалить?

Похоже на голый labels $@ вызов до того, как цикл печатает информацию. Избавься от этого.

2) Вы, вероятно, должны перенести эту логику в нижнюю команду awk. Назначение ассоциативного массива можно выполнить во втором блоке /[0-9]/, а логику END можно поместить непосредственно в блок END большого сценария.

3) текстовый файл имеет 8 полей в строке? В качестве отладки используйте что-то вроде print NF > "/dev/stderr";, чтобы убедиться, что при установке переменных действительно есть 8 полей.

0 голосов
/ 27 июня 2012

1) Почему строка 1 110114072915 находится сверху и как ее удалить?

Фу Бах правильно ответил на этот вопрос.

Это выглядит неправильноя:

for a in $@
do
labels $@ | gawk '

Почему вы перебираете все аргументы, затем запускаете labels $@ не labels $a?

2) Как я могу использовать функцию label2 ()

Я бы запустил функцию и назначил вывод переменной awk:

labels $@ | gawk -v "bnames=\"$(labels $a)\"" '

Затем использовал эту переменную в сценарии awk:

    print "        \"data\": [", bnames

3) Это последний вопрос: почему бы не работать

Я не знаю, но вы никогда не поймете это, если не разберете проблему на более мелкие части иотлаживай сам.Если вы пишете сценарий awk из ста строк, и он не работает, ответ состоит в том, чтобы попытаться заставить работать более простую версию из десяти строк, а затем увеличить ее по частям и проверить, работает ли каждая часть.

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