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

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

  • Автоматизация труб?
  • какая оболочка будет использовать sudo для выполнения сценария оболочки без строки shebang
  • Можете ли вы указать, был ли файл переименован?
  • Поиск каталога рекурсивно для файлов, перечисленных в csv, и скопировать их в другое место
  • «Stdin: не является tty» почтой для запуска скриптов в качестве заданий cron
  • cat STDIN не будет работать дважды в скрипте
  • Запускать while в сценарии systemd
  • Извлечь значения из форматированного текста
  • 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 и выполнить дополнительное форматирование. Мультилинер всегда легче отлаживать (в случае вашего Вопроса), а также поддерживает и дает более значимые (номера строк) сообщения об ошибках.

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