使用jq替换字典中的数组值

时间:2018-11-10 18:25:15

标签: arrays json bash dictionary jq

我有一本字典,看起来像:

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

使用非json格式的数组制作jq时遇到一些麻烦。 我尝试了各种发现的解决方案,但没有一个起作用。 帖子jq - How to select objects based on a 'whitelist' of property values似乎解决了类似的问题,但不适用于我的输入内容:

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 :(得分:2)

这里

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

输出

value01
value02
value03

有关更多信息,请参见man jq

答案 1 :(得分:1)

使用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的绝佳时机。或者,您可以通过以下步骤简单地搜索其定义:jq "def INDEX"