问题 使用jq更新dicts数组中的一个值


我想更新dict中的值,我只能通过dict中的另一个值来识别。也就是说,鉴于此输入:

[
  {
    "format": "geojson",
    "id": "foo"
  },
  {
    "format": "geojson",
    "id": "bar"
  },
  {
    "format": "zip",
    "id": "baz"
  }
]

我想改变 baz'csv'的伴随格式:

[
  {
    "format": "geojson",
    "id": "foo"
  },
  {
    "format": "geojson",
    "id": "bar"
  },
  {
    "format": "csv",
    "id": "baz"
  }
]

我发现这有效:

jq 'map(if .id=="baz" then .format="csv" else . end)' my.json

但这看起来相当冗长,所以我想知道是否有一种更优雅的方式来表达这一点。 jq似乎缺少某种表达式选择器,相当于可能 [@id='baz'] 在xpath中。

(当我开始这个问题时,我有 [.[] |...]然后我发现了 map,所以它并没有我想象的那么糟糕。)


7429
2018-04-21 12:48


起源



答案:


您正在寻找复杂的作业:

jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json

也许不会更短,但要求更优雅。请参阅文档的最后一部分: http://stedolan.github.io/jq/manual/#Assignment

编辑:使用 map

jq 'map((select(.id == "baz") | .format) |= "csv")' my.json 

15
2018-04-21 13:10



啊哈。我注意到有一个多余的管道(我想)。所以它可能是: jq '(.[] | select(.id == "baz") .format) |= "csv"' my.json - Steve Bennett
另一种变化: map(select(.id == "corangamite").format |= "csv") - Steve Bennett
是的,好的;我已经添加了一个变体 map;我不确定省略管道的符号 - Hans Z.


答案:


您正在寻找复杂的作业:

jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json

也许不会更短,但要求更优雅。请参阅文档的最后一部分: http://stedolan.github.io/jq/manual/#Assignment

编辑:使用 map

jq 'map((select(.id == "baz") | .format) |= "csv")' my.json 

15
2018-04-21 13:10



啊哈。我注意到有一个多余的管道(我想)。所以它可能是: jq '(.[] | select(.id == "baz") .format) |= "csv"' my.json - Steve Bennett
另一种变化: map(select(.id == "corangamite").format |= "csv") - Steve Bennett
是的,好的;我已经添加了一个变体 map;我不确定省略管道的符号 - Hans Z.