Вложенный цикл while с входом из main while в сценарии оболочки - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть файл Json, и я пытаюсь разобрать его, используя ниже

#!/bin/ksh
while read rec
 do
    while read line
    do
        firstname=`echo $line | sed -n -e 's/^.*\(full-name\)/\1/p' | cut -f3 -d'"'`
        id=`echo $line | sed -n -e 's/^.*\(id\)/\1/p' | cut -f3 -d'"'`
        echo "${firstname}'|'${id}"
        done < `echo $rec | nawk 'gsub("}}}}", "\n")' | sed 's/{"results"//g'`

done < /var/tmp/Cloud_test.txt

Мой пример файла:

{"results": [{"general-info": {"full-name": "TELOS MANAGEMENT", "body": {"party": {"xrefs": {"xref": [{"" идентификатор ":" 66666 "}]}}}}," _ идентификатор ":" 91002551 "}, {" _ идентификатор ":" 222222" , "тело": { "партии": { "вообще-инфо": { "полный -name ":" DO REUSE "}," xrefs ": {" xref ": [{" id ":" 777777 "}]}}}}]}

Ожидаемый результат:
TELOS MANAGEMENT | 66666
DO REUSE | 777777

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Как указал @ l0b0, эту проблему лучше всего решить с помощью инструмента, поддерживающего JSON, такого как jq . Здесь, вот, решение JQ.

Следует отметить, однако, что выборочный ввод странно нерегулярен, поэтому требования не так ясны. Если бы JSON был более регулярным, решение jq было бы проще.

В любом случае следующий фильтр jq выдаст результат, как описано:

.results[]
| ..
| objects
| select(has("general-info"))
| [(.["general-info"]|.["full-name"]), (.. | .id? // empty)]
| join("|")

Облегчение

Вторая последняя строка выше может быть упрощена до:

[."general-info"."full-name", (.. | .id? // empty)]
0 голосов
/ 27 апреля 2018

Это более сложный (двойной) случай этот вопрос .

У меня работает следующее:

cat sample.json | sed -e 's/"full-name"/\n&/g' | tail -n+2 | sed -e 's/"full-name":"\([^"]*\).*{"id":"\([^"]*\).*/\1\|\2/'

...