【问题标题】:Use jq to replace array values from dictionary使用 jq 替换字典中的数组值
【发布时间】:2019-04-13 23:44:27
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 欢迎来到 SO。 Stack Overflow 是一个面向专业和狂热程序员的问答网站。目标是您将一些自己的代码添加到您的问题中,以至少显示您为解决这个问题所做的研究工作。
  • 感谢您的欢迎。我编辑了我的答案

标签: arrays json bash dictionary jq


【解决方案1】:

这里

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

输出

value01
value02
value03

更多信息请参见man jq

【讨论】:

  • 最后一个问题:在字典中找不到时是否可以显示原始键?喜欢:输入:key01 key02 key03 notFound 输出:value01 value02 value03 notFound
  • 再问一个问题。
【解决方案2】:

使用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"

【讨论】:

  • 我应该补充说我必须使用 jq 1.5
  • 所以复制def,可以通过谷歌搜索jq “def INDEX"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多