如何使用jq创建增量索引

UVR*_*ion 8 bash json jq

我有一个这样的 json :

[
    {"data":"a"},
    {"data":"b"},
    {"data":"c"}
]
Run Code Online (Sandbox Code Playgroud)

使用 jq 我想添加一个增量 id 字段,如下所示:

[
    {"data":"a","id":"xx_1"},
    {"data":"b","id":"xx_2"},
    {"data":"c","id":"xx_3"}
]
Run Code Online (Sandbox Code Playgroud)

我似乎无法获得正确的 jq 命令,有人吗?

pea*_*eak 7

这是一种方法:

to_entries | map( (.value.id = "xx_\(1+.key)" ) | .value)
Run Code Online (Sandbox Code Playgroud)

这是另一种方法,但需要 jq 1.5:

def add_id(prefix):
  [ foreach .[] as $o (0;
      . + 1;
      $o + {"id": (prefix + tostring) }) ];

add_id("xx_")
Run Code Online (Sandbox Code Playgroud)

例子:

$ jq -c -f add_id.jq
[ {"data":"a"}, {"data":"b"}, {"data":"c"} ]
Run Code Online (Sandbox Code Playgroud)

输出:

[{"data":"a","id":"xx_1"},{"data":"b","id":"xx_2"},{"data":"c","id":"xx_3"}]
Run Code Online (Sandbox Code Playgroud)

第三种方法是使用transpose

def add_id(prefix):
  [ .,  [ range(0;length) | {"id": (prefix + tostring) } ] ]
  | transpose | map(add);
Run Code Online (Sandbox Code Playgroud)

(如果您的 jq 没有 transpose/0,则可以轻松找到它的 jq 定义,例如通过谷歌搜索。)


jq1*_*727 5

这里有两个解决方案。一种使用foreach,它在 foreach 状态下保存一个计数器,同时迭代输入数组,将值收集回结果数组。这类似于peakadd_id函数。

[
  foreach .[] as $e (
     0
   ; .+1
   ; $e + {"id":"xx_\(.)"}
  )
]
Run Code Online (Sandbox Code Playgroud)

一种使用reduce,将输入数组保持在reduce 状态,同时迭代数组索引,更新每个元素。

reduce range(0,length) as $i (
     .
   ; .[$i].id = "xx_\($i+1)"
)
Run Code Online (Sandbox Code Playgroud)

我认为对于这种情况,减少是更简单的。