2015-12-29 28 views
1

增量索引我这样一个JSON有:如何创建与JQ

[ 
{"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命令

回答

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定义可以很容易地发现,如通过谷歌搜索。)

+0

好的!你摇滚! :) – hek2mgl

+0

谢谢!很棒! – UVRadiation

0
var data=[ 
    {"data":"a"}, 
    {"data":"b"}, 
    {"data":"c"} 
    ]; 
    var cnt=0; 
    data.map(function(data){ 
     data.id="xx_"+cnt; 
     cnt++; 
    }) 

console.log(data); 
+0

对不起,我忘了提及我需要使用bash创建它......我将编辑 – UVRadiation

0

这里有两个解决方案。一个使用foreach,它在foreach状态下持有一个计数器,同时遍历输入数组将数据收集回结果数组中。这与peakadd_id函数类似。

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

和一个使用减少保持所述输入阵列中的降低状态,而遍历数组索引,更新每个元素。

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

我觉得减少是这种情况下,简单的一个。