Преобразование массивов таблиц Json в объекты с помощью jq

Следующий скрипт Python добавит все файлы, указанные в качестве аргументов, в список недавно -использованных, используя GIO:

#!/usr/bin/python3

import gi, sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio, GLib

rec_mgr = Gtk.RecentManager.get_default()

for arg in sys.argv[1:]:
    rec_mgr.add_item(Gio.File.new_for_path(arg).get_uri())

GLib.idle_add(Gtk.main_quit)
Gtk.main()

Последние две строки необходимы для запуска цикла событий Gtk; если вы этого не сделаете, измененный сигнал от менеджера не будет обработан, и файлы не будут добавлены в список недавно использованных -.

4
26.05.2020, 22:00
2 ответа

Отвечая на свой вопрос:

jq 'to_entries|map(.key) as $keys| (map(.value)|transpose) as $values |$values|map([$keys,.] | transpose| map( {(.[0]):.[1]} ) | add)'

Объяснение :Извлечь ключи ["IdentifierName", "Code"] и значения как [ [ "A", 5 ], [ "B", 8 ], [ "C",19 ] ]
Затем, чтобы индексировать от ключей к значениям, возьмите json -последовательность ключа -кортежа с (каждым )значением кортежа, транспонируйте и заархивируйте их попарно.

 echo '[[
    "IdentifierName",
    "Code"
  ],
  [
    "C",
    19
  ]
]'|jq '.|transpose| map( {(.[0]):.[1]} ) | add'

Объединение обоих дает решение. Это будет работать для любого количества элементов (0 и 1 — это просто ключ и значение, а не первый и второй ).

3
18.03.2021, 23:32
$ jq '[.IdentifierName,.Code] | transpose | map( { "IdentifierName":.[0], "Code":.[1] } ) ' file.json
[
  {
    "IdentifierName": "A",
    "Code": 5
  },
  {
    "IdentifierName": "B",
    "Code": 8
  },
  {
    "IdentifierName": "C",
    "Code": 19
  }
]

Я извлекаю два массива в массив (из двух массивов ), которые я транспонирую. Для заданных данных это дает [["A",5],["B",8],["C",19]]. Затем я сопоставляю каждый отдельный элемент этого массива с объектом с нужными ключами.

Возможно, это можно было бы как-то сделать поаккуратнее. Например, было бы хорошо не реконструировать объекты в конце с явными именами ключей, и было бы также хорошо, если бы можно было обобщить это до n sub -] массивы, а не только два.

2
18.03.2021, 23:32

Теги

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