2015-12-29 36 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)" 
) 

我覺得減少是這種情況下,簡單的一個。