2015-06-07 23 views
1

我有一些數據這樣的:JQ聚合和交叉

[ 
    { 
    "count": 4, 
    "trial_status": "Follow up", 
    "date": "2015-06-06" 
    }, 
    { 
    "count": 3, 
    "trial_status": "Hold", 
    "date": "2015-06-06" 
    }, 
    { 
    "count": 2, 
    "trial_status": "Trial", 
    "date": "2015-06-06" 
    }, 
    { 
    "count": 1, 
    "trial_status": "Trial + Confirm", 
    "date": "2015-06-06" 
    }.... 

,我想轉換到

{"2015-06-06": {"Trial + Confirm": 1, "Follow Up": 4, "Hold": 3, "Trial": 2}} 

我賺不了多少進展與我的任何方法,以便將非常感謝一些幫幫我。

回答

1

這應該工作:

group_by(.date) | map({ 
    key: .[0].date, 
    value: map({ 
     key: .trial_status, 
     value: .count 
    }) | from_entries 
}) | from_entries 

的關鍵是使用from_entries建立的映射。 這是您可以按名稱設置「屬性」/鍵的唯一方法。 您只需生成組成對象的鍵/值對。


聖地亞哥指出,你可以動態設置通過名稱的屬性與特殊的語法。這也會起作用。

group_by(.date) | map({ 
    (.[0].date): map({ 
     (.trial_status): .count 
    }) | add 
}) | add 
+0

偉大的答案!正如一個毫無意義的有趣功能:'from_entries'不是編程式設置鍵名的唯一方法:'{(foo):bar} |添加'也是一樣的。雖然由於可讀性問題,我個人更喜歡'from_entries',但這個腳本的行爲與您的行爲相同:'group_by(.date)| map({(。[0] .date):map({(。trial_status):.count})| add})|添加' –

+0

哦,謝謝你的提示,我忘了那個語法。我正在嘗試一些根本不起作用的東西。 –

0

如果你發現,因爲裏面的地圖的地圖你的頭紡紗,或者如果你喜歡直接的辦法(在這種情況下,至少也恰好是快速和簡單的),可以考慮使用reduce像這樣: reduce .[] as $o ({}; . + {($o.date): (.[$o.date] + {($o.trial_status): $o.count})})

由於JQ的null語義,這可以簡化和縮短爲: reduce .[] as $o ({}; .[$o.date] += { ($o.trial_status): $o.count })

1

下面是一個溶液中使用reducedestructuring variable bindingsetpath

reduce .[] as {count:$c, trial_status:$s, date:$d} (
    {} 
; setpath([$d, $s]; $c) 
) 

如果該過濾器是filter.jqdata.json包含樣本數據則命令

$ jq -M -f filter.jq data.json 

產生

{ 
    "2015-06-06": { 
    "Follow up": 4, 
    "Hold": 3, 
    "Trial": 2, 
    "Trial + Confirm": 1 
    } 
}