Используйте jq для замены значений массива из словаря - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть словарь, который выглядит следующим образом:

cat dictionary.json
[
  {
    "key": "key01",
    "value": "value01"
  },
  {
    "key": "key02",
    "value": "value02"
  },
  {
    "key": "key03",
    "value": "value03",
    "extraProperty": {
      "foo": "bar"
    }
  },
  {
    "key": "key04",
    "value": "value04"
  }
]

Тогда у меня есть массив, который:

echo $array
key01 key02 key03

Ожидаемый результат:

value01 value02 value03

У меня возникли проблемы с созданием jq с использованием массива, отличного от формата json. Я пробовал разные решения, которые нашел, но ни одно из них не сработало. Этот пост jq - Как выбрать объекты на основе «белого» списка значений свойств , кажется, решает аналогичную проблему, но не работает с моим вводом:

echo $array | jq --argfile whitelist dictionary.json 'select(any(.key== $whitelist[]; .value))'
parse error: Invalid numeric literal at line 1, column 6

Я тоже пытался использовать

jq -n --arg array $array --argfile whitelist dico.json 'select(any(.key== $whitelist[]; .valuee))'
jq: error: key02/0 is not defined at <top-level>, line 1:
key02
jq: 1 compile error

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Используя INDEX/2, который составляет словарь:

echo 'key01 key02 key03' |
  jq -Rr --argfile dict dictionary.json '
    INDEX($dict[]; .key) as $d
    | split(" ") | map( $d[.]|.value )
    | join(" ")'

Выходы:

value01 value02 value03

Если у вашего jq нет INDEX, то сейчас самое время обновить его до jq 1.6; в качестве альтернативы, вы можете просто перехватить его def, прибегая к помощи: jq "def INDEX"

0 голосов
/ 10 ноября 2018

Здесь

jq -r --arg array "$array" \
  'from_entries | .[($array | split(" "))[]]' \
  dictionary.json

выход

value01
value02
value03

См. man jq для получения дополнительной информации.

...