Преобразование 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 

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

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 и выполнить дополнительное форматирование. Мультилинер всегда легче отлаживать (в случае вашего Вопроса), а также поддерживает и дает более значимые (номера строк) сообщения об ошибках.

  • Превращение стандартного вывода в одну команду
  • Почему я получаю «строка 1: $ ': \ r': command not found"?
  • Как тайм-аут по часам в Bash (и сохранить тайм-аут, даже если сессия была закрыта)?
  • проанализировать файл журнала, который принимает аргумент (время выполнения тестов)
  • Пакетное преобразование файлов модулей с помощью XMP
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Сортировка файла на основе средней части
  • Условия внутреннего контура должны зависеть от хода внешнего цикла
  • Как использовать SFTP в скрипте для неинтерактивного вывода файла с удаленного хоста?
  • Как использовать sed для замены строк, в которых есть «\»?
  • Есть ли элегантный способ установить переменную оболочки в содержимое файла?
  • путают с переменными awk и shell
  • Linux и Unix - лучшая ОС в мире.