Преобразование json-объекта сопоставления в управляемую строку csv с использованием сценария bash

У меня есть json-отображение под ключом properties как показано ниже в файле Customer.json,

 { "customer": { "properties": { "customerId": { "type": "string", "index": "not_analyzed" }, "name": { "type": "string", "index": "not_analyzed" } } } } 

Который я хочу преобразовать в следующее с key и displayName дублируемым и type сверху,

 field(key: 'customerId', displayName: 'customerId', type: 'String') field(key: 'name', displayName: 'name', type: 'String') 

Я ударил и попробовал bash + python, как показано ниже, предполагая, что он выбрал ключ клиента первым и петли внутри свойств,

 $ cat Customer.json | python -c 'import sys; import simplejson as json; \ print "\n".join( [i["properties"] for i in json.loads( sys.stdin.read() )["customer"]] )' Traceback (most recent call last): File "<string>", line 2, in <module> TypeError: string indices must be integers, not str 

Я также открыт для других решений.

  • Изменение измененной даты файла в зависимости от даты в имени файла
  • Fdisk в интерактивном режиме
  • linux curl POST запрос не работает
  • Shell Script для изоляции файлов, разбросанных по разным папкам
  • Оценка переменной чтения в той же строке в сценарии bash
  • Ошибка: неоднозначное перенаправление при передаче вывода команде
  • Скопируйте файлы из каталога, если имя присутствует в текстовом файле
  • Файл читается всеми, но я не могу открыть файл
  • 2 Solutions collect form web for “Преобразование json-объекта сопоставления в управляемую строку csv с использованием сценария bash”

    Анализ таких структурированных данных лучше всего делать с использованием выделенного анализатора, как и вы. Однако в этом конкретном случае это достаточно просто, что вы могли бы сделать:

     $ grep -B 1 '"type":' Customer.json | tr $'"' $"'" | sed 's/[:,]//g' | awk '{print "field(key: "$1",\tdisplayName: "$1",\t type: "$NF")"}' RS="--" 

    Что возвращает:

     field(key: 'customerId', displayName: 'customerId', type: 'string') field(key: 'name', displayName: 'name', type: 'string') 

    Ошибка кажется мне понятной, переменная «i» является строкой, так как цикл for выполняет итерацию над значением «customer» dict / mapping. Это значение является самим dict / mapping, и итерация по нему приведет вас к успеху списка ключей (т. Е. ["Properties"].

     cat Customer.json | python -c 'import sys; import simplejson as json; \ print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )' 

    дам тебе

      customerid name 

    и следующее должно приблизиться к вашей цели:

     cat Customer.json | python -c 'import sys; import simplejson as json; \ print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )' 

    который дает:

     customerId {'index': 'not_analyzed', 'type': 'string'} name {'index': 'not_analyzed', 'type': 'string'} 

    Оттуда я бы порекомендовал вам сделать python в скрипте. Вам нужно будет решить, как получить из string в String и выполнить дополнительное форматирование. Мультилинер всегда легче отлаживать (в случае вашего Вопроса), а также поддерживает и дает более значимые (номера строк) сообщения об ошибках.

    Interesting Posts

    3DR Solo Drone WiFi Communication

    На сервере HP-UX опция grep -r не работает

    объединить несколько файлов на основе первого столбца и сохранить проблемы с памятью

    сжатие содержимого rpm

    Как я могу проинструктировать yum о том, чтобы установить определенную версию OpenJDK

    Есть ли параметр / etc / network / interfaces, например wireless-ap, за исключением соединения wpa-ssid / wpa-psk?

    Как скопировать многостраничный текст с терминала в буфер обмена?

    Настройте локальную точку доступа Wi-Fi на компьютере

    Как настроить пользовательскую квоту для / var / www?

    Выполняют ли команды в подстановке команд, подстановке процессов и в конвейере принимают входные данные stdin?

    Может ли параметр BS вызывать несогласованность данных с dd?

    Удалите повторяющиеся строки с помощью twist

    Печать файла с локального компьютера с использованием принтера, подключенного к удаленному серверу

    Как получить разбивку сегментации, работающую с systemd-networkd?

    Bash работает с несколькими программами и закрывается

    Linux и Unix - лучшая ОС в мире.