2017-01-27 6 views
0

У меня есть два файла json, один содержит имя ключа карты и тип, другой - плоский файл json.Можно ли использовать jq для замены значения в одном json-файле из другого json-файла словаря?

например. первый файл содержит что-то вроде этого:

[ { "field": "col1", "type": "int" }, { "field" : "col2", "type" : "string" }] 

второй файл большой jsons файл объекта, разделенных линией разрыва:

{ "col1":123, "col2": "foo"} 
{ "col1":123, "col2": "foo"} 
... 

можно использовать JQ, чтобы генерировать выходной JSON как это:

{ "col1":{ "int" : 123 }, "col2": { "string" : "foo"} } 
{ "col1":{ "int" : 123 }, "col2": { "string" : "foo"} } 

.... 
+0

ЗАКАНЧИВАТЬ' jq', чтобы легко поглотить ваш второй файл. Это делает половину работы, но я слишком много новичок с 'jq' для создания второй половины. – Aaron

ответ

1

Несомненно. Вы можете превратить ваш первый файл в более простом потребить формат первым: привяжите .type к .field свойств для объекта (для использования в качестве словаря)

reduce .[] as $i ({}; .[$i.field] = $i.type) 

Тогда вы могли бы пройти через ваш второй файл, чтобы использовать эти сопоставления для обновления значений. Используйте --argfile, чтобы прочитать содержимое первого файла в переменной.

$ jq --argfile file1 file1.json ' 
(reduce $file1[] as $i ({}; .[$i.field] = $i.type)) as $map 
    | with_entries(.value = { ($map[.key]): .value }) 
' file2.json 

, который дает: `--slurpfile` вариант

{ 
    "col1": { 
    "int": 123 
    }, 
    "col2": { 
    "string": "foo" 
    } 
} 
{ 
    "col1": { 
    "int": 123 
    }, 
    "col2": { 
    "string": "foo" 
    } 
} 
1

Да. Вы можете использовать опцию -slurpfile, но ваш словарь уже представляет собой единую сущность JSON (объект JSON в вашем случае), поэтому было бы проще прочитать словарь, используя параметр -argfile.

Предполагая, что:

  • ваш JQ фильтр находится в файле, скажем merge.jq;
  • Ваш словарь в словаре.json;
  • ваш входной поток в input.json

JQ вызов будет выглядеть следующим образом:

jq -f merge.jq --argfile dict dictionary.json input.json 

С выше, вы бы, конечно, обратиться к словарю, как $ Dict в слиянии. JQ

(Конечно, можно указать фильтр в командной строке JQ, если это то, что вы предпочитаете.)

Теперь к вам!

 Смежные вопросы

  • Нет связанных вопросов^_^