Итерация над json в оболочке [duplicate]

Самый простой способ обеспечить отношения, которые вы хотите, состоит в том, чтобы выводить типы схем подмножества путем ограничения от типов схемы чертежа. Звучит так, будто эта лодка уже отплыла.

Как и другие здесь, я не знаю каких-либо инструментов, которые делают это из коробки (хотя, если Петру Гардеа говорит, что QT Assistant может, стоит следить).

Одно из осложнений состоит в том, что существует два способа просмотра отношения подмножества / надмножества, которое вы хотите проверить: (1) каждый документ (или элемент), принятый как действительный по схеме 1, также принимается как действительный по схеме 2 (без ссылки на сделанные присвоения типа) или (2) типизированные документы, полученные путем проверки (в том, что спецификация вызывает информационный бюллетень после схемы) по схемам 1 и 2, находятся в соответствующем отношении друг к другу: if элемент или атрибут действителен в дереве 1, он действителен в дереве 2; тип, назначенный ему в дереве 1, является ограничением типа, назначенного ему в дереве 2; и т. д. Если схемы 1 и 2 были разработаны независимо, вероятность того, что их типы связаны деривацией, плоха, поэтому, я думаю, у вас есть первый подход к этому вопросу.

Проблема, однако, определенно разрешима в любой форме. Для любой схемы (я использую этот термин тщательно) есть по определению конечное число типов и конечное число объявленных имен элементов; следует, что существует конечное число (возможно, большое) пар имя / тип элемента.

Алгоритм может пойти примерно так.

  1. Начать с ожидаемого корневого элемента. (Если имеется несколько возможных корневых элементов, тогда в общем случае вам нужно будет выполнить эту проверку для каждого из них.) Если ожидаемым корневым элементом является E, с типом T1 в схеме 1 и типом T2 в схеме 2, тогда поместите задачу «Сравнить тип T1 и T2» в очередь открытых задач. Список заданий, уже выполненных, будет пустым.
  2. Для сравнения двух сложных типов T1 и T2: проверьте набор атрибутов, объявленных для T1 и T2, для отношения подмножества / надмножества между их именами. Удостоверьтесь, что атрибут, требуемый в предполагаемом суперсете, отсутствует или необязателен в предполагаемом подмножестве. Каждому атрибуту A, объявленному для T1 и T2, будет присвоен тип (вызовите их ST1 и ST2). Если ST1 = ST2, ничего не делайте; в противном случае добавьте задачу «Сравнить простые типы ST1 и ST2» в очередь открытых задач, если она не находится в списке уже выполненных сравнений. Теперь проверьте последовательности дочерних элементов, которые возможны в T1 и T2, - как предлагает 13ren в комментарии, это приемлемо, поскольку модели контента являются по существу регулярными выражениями, которые используют набор имен элементов в качестве их алфавита; соответственно, языки, которые они определяют, являются регулярными, а отношение подмножества / надмножества разрешимо для обычных языков. Каждому возможному дочернему элементу C присваивается как объявление элемента, так и определение типа родительскими типами T1 и T2. Назовем их ED1, ED2, CT1 и CT2. Каждый ребенок с тем же именем будет иметь один и тот же тип, но разные дети могут соответствовать объявлениям разных элементов. Поэтому для любого возможного имени будет только одна пара типов CT1 и CT2, но может быть несколько пар ED1 и ED2 (и анализ должен быть осторожен, чтобы убедиться, что они правильно согласованы, что может быть трудно автоматизировать). Если CT1 = CT2, ничего не делайте, в противном случае установите «Сравнить типы CT1 и CT2» в открытую очередь задач, если сравнение не было выполнено. Если ED1 и ED2 структурно идентичны, ничего не делайте; в противном случае ставится задача сравнить их в очереди задач (если только это уже сделано).
  3. Чтобы сравнить два простых типа ST1 и ST2, сравните их лексические пространства (если вы хотите получить первое определение отношения подмножества / надмножества на схемах) или их пространств значений (если вы хотите второй). Если ST1 и ST2 являются ограничениями одного и того же примитивного типа, вы можете легко сравнить набор эффективных ограничений на основе фасетов. Факт шаблона может усложнять ситуацию, но поскольку он определяет набор регулярных выражений, отношение подмножества / надмножества разрешимо для него.
  4. Чтобы сравнить объявления двух элементов, вам нужно сравнить каждое из свойств для элемент и объявить о желаемом соотношении подмножество / надмножество.

Как вы можете видеть, достаточно сложно и утомительно, что вы действительно хотите автоматизировать этот анализ, и он также достаточно сложный, что легко чтобы понять, почему это широко не предлагается как готовая функция. Но, конечно, было бы интересно закодировать.

24
задан jq170727 5 September 2017 в 06:38
поделиться

2 ответа

Чтобы получить ключи верхнего уровня в виде потока, вы можете использовать клавиши []. Таким образом, одним из решений вашей конкретной проблемы будет:

jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"' 

keys создает имена ключей в отсортированном порядке; если вы хотите их в исходном порядке, используйте keys_unsorted.

Другой альтернативой, которая производит ключи в исходном порядке, является:

jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'

CSV и TSV output

Фильтры @csv и @tsv также могут быть рассмотрены здесь, например

jq -r 'to_entries[] | [.key, .value.ip] | @tsv'

производит:

host1   10.1.2.3
host2   10.1.2.2
host3   10.1.18.1
41
ответ дан peak 16 August 2018 в 04:04
поделиться

Вышло очень элегантное решение

jq 'with_entries(.value |= .ip)'

Какой из них

{
  "host1": "10.1.2.3",
  "host2": "10.1.2.2",
  "host3": "10.1.18.1"
}

Вот фрагмент jqplay для воспроизведения с помощью: https://jqplay.org/ s / Jb_fnBveMQ

Функция with_entries преобразует каждый объект в список объектов в Key / Value-pair, поэтому мы можем получить доступ к .key или .value соответственно, мы обновление (переписывание) каждого KV-элемента .value с полем .ip с помощью оператора |= обновления |=

7
ответ дан Viacheslav 16 August 2018 в 04:04
поделиться
  • 1
    Это решение является точным ответом. Выбранное решение имеет дополнительные функции, которые полезны, но не такие точные и изящные. Вы можете добавить краткое объяснение и полную команду. – Mike D 17 March 2018 в 02:09
Другие вопросы по тегам:

Похожие вопросы: