如何使用jq创建增量索引

时间:2015-12-29 12:07:57

标签: json jq

我有一个类似的json:

[
{"data":"a"},
{"data":"b"},
{"data":"c"}
]

使用jq我想添加一个增量id字段:

[
{"data":"a","id":"xx_1"},
{"data":"b","id":"xx_2"},
{"data":"c","id":"xx_3"}
]

我似乎没有得到正确的jq命令,任何人?

EDIT 我需要使用bash命令

执行此操作

3 个答案:

答案 0 :(得分:2)

以这种方式:

to_entries | map( (.value.id = "xx_\(1+.key)" ) | .value)

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

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

add_id("xx_")

示例:

$ jq -c -f add_id.jq
[ {"data":"a"}, {"data":"b"}, {"data":"c"} ]

输出:

[{"data":"a","id":"xx_1"},{"data":"b","id":"xx_2"},{"data":"c","id":"xx_3"}]

第三种方法是使用transpose

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

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

答案 1 :(得分:0)

collections.Counter

答案 2 :(得分:0)

这是两个解决方案。一个使用 foreach ,它在foreach状态下持有一个计数器,同时迭代输入数组,将值收回到结果数组中。这类似于peak add_id 功能。

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

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

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

我认为 reduce 对于这种情况来说更简单。