2017-07-19 43 views
0

我JSON陣列的流這樣JQ加在嵌套數組的一個關鍵的價值並提供給新的密鑰

[{"id":"AQ","Count":0}] 
[{"id":"AR","Count":1},{"id":"AR","Count":3},{"id":"AR","Count":13}, 
{"id":"AR","Count":12},{"id":"AR","Count":5}] 
[{"id":"AS","Count":0}] 

我想用JQ獲得這樣

{"id":"AQ","Count":0} 
{"id":"AR","Count":34} 
{"id":"AS","Count":0} 
一個新的JSON

34 = 1 + 3 + 13 + 12 + 5它們在第二個陣列中。 我不知道如何詳細描述它。但是我的例子顯示了基本的想法。 我使用bash並傾向於使用jq來解決這個問題。謝謝!

+1

你只是將所有的替代inputs按ID計數? –

+0

是............... !!!! – Eleanor

+0

如果你想要的輸出是'{「AQ」:0,「AR」:34,「AS」:0}',那會更容易。 –

回答

1

假設.ID是每個陣列中的相同:

first + {Count: map(.Count) | add} 

或者更可理解的:

(map(.Count) | add) as $sum | first | .Count = $sum 

或者更聲明:

{ id: (first|.id), Count: (map(.Count) | add) } 
+0

謝謝!!!!!! – Eleanor

0

這有點kludgey,但鑑於您的輸入:

jq -c ' 
    reduce .[] as $item ({}; .[($item.id)] += ($item.Count)) 
    | to_entries 
    | .[] | {"id": .key, "Count": .value} 
' 

產生了輸出:

{"id":"AQ","Count":0} 
{"id":"AR","Count":34} 
{"id":"AS","Count":0} 
+0

你知道jq有一個函數add right?我在想我是否可以使用jq'map(.Count)|添加'返回0 34 0,然後給這3個數字一個鍵「計數」。但我不知道如何增加一個新的密鑰的價值...... – Eleanor

+0

我會先試試你的方法! – Eleanor

2

如果你想要一個有效的,但通用的解決方案,不承擔每個輸入數組有相同的ID,那麼下面的輔助功能,使解決方案很簡單:

# Input: a JSON object representing the subtotals 
# Output: the object augmented with additional subtotals 
def adder(stream; id; filter): 
    reduce stream as $s (.; .[$s|id] += ($s|filter)); 

假設你的jq有inputs,那麼最有效的方法就是使用它(但記得使用-n命令行選項):

reduce inputs as $row ({}; adder($row[]; .id; .Count)) 

這將產生:

{"AQ":0,"AR":34,"AS":0} 

從這裏,可以很容易地得到你想要的答案,例如使用to_entries[] | {(.key): .value}

如果您JQ沒有inputs,如果你不想升級,然後使用-s選項(而不是-n)和.[]

相關問題