在jq中增加arg

时间:2017-01-02 18:53:03

标签: json increment jq

我有类似的东西:

jq --arg START 10 '[.z[] | select(has("name")) | {id: $START | tonumber, name}]'

使用'name'键转换为对象数组,附加增量id,输出:

[
  {
    id: 10,
    name: "stuff"
  },
  {
    id: 10,
    name: "more stuff"
  }
]

如何增加START arg以使第二个对象的id为11,依此类推?

编辑:我应该发布原始的json:

{
  "u": "stuff",
  "x": [1,2,3],
  "y": {
    "field": "value"
  },
  "z": {
    "stuffWithoutName": {
       "ex": "stuff"
    },
    "zz": {
       "name": "change me",
       "more": "stuff"
    },
    "randomKey":  {
       "name": "change me",
       "random": "more stuff"
    }
  }
}

谢谢!

2 个答案:

答案 0 :(得分:2)

假设你的jq有foreach

# emit a stream of {id:_, value: _} objects
def counts(s; start):
  foreach s as $i (start-1; .+1; {id:., value: $i});

[ counts(.z[] | select(has("name")); $START|tonumber)
| {id, name: .value.name} ]

由于上面假设你有foreach,你也可以使用--argjson选项,它允许你将START的值作为JSON号传递。

如果您的jq没有foreach,则可以轻松修改上述内容以使用reduce

后记

根据对问题的修订,看起来您希望您的jq程序具有以下形式:

.z = [ ... ]

.z |= [[.[] | select(has("name"))] | to_entries | ...

或同等的。

答案 1 :(得分:2)

您可以使用to_entries,当给定数组时,它将为每个项目提供索引:

jq --arg START 10 '($START | tonumber) as $s
  | [.z[] | select(has("name"))]
  | to_entries
  | map({name:.value.name, id: ($s + .key) })'

这样,id10 + 0变为10 + n