2016-09-21 44 views
0

輸入是:JQ:通過選擇性地選擇從對象/嵌入式陣列值形成CSV

{"1.2.3.4":[{"Value":"myval1","Key":"mykey1"}, {"Value":"myval3","Key":"mykey3"},{"Value":"myval2","Key":"mykey2"},{"Value":"myval4","Key":"mykey4"}]} 
{"4.5.6.7":[{"Value":"myval1","Key":"mykey1"}, {"Value":"myval3","Key":"mykey3"},{"Value":"myval2","Key":"mykey2"},{"Value":"myval4","Key":"mykey4"}]} 

我想獲得是:

"1.2.3.4,myval1,myval3" 
"4.5.6.7,myval1,myval3" 

基本上提取第一字段,然後值來自嵌入值字段的「mykey1」和「mykey2」。

編輯:

我曾嘗試:

我可以做一些像下面提取值:

jq -c '."1.2.3.4" | .[]' | jq -s 'from_entries | [.mykey1, .mykey2] | join(",")' 

我想包括我的對象名稱和以及我的對象名稱變化,所以我不能真正過濾硬編碼值

+0

您已經嘗試了什麼? – Aby

回答

2

您可以這樣做:

$ jq -r --argjson cols '["mykey1","mykey2"]' '[to_entries[] | .key, (.value | from_entries[$cols[]])] | @csv' input.json 

將對象轉換爲條目列表是訪問過濾器對象中的鍵和值的簡單方法。

+0

如果你真的想要「1.2.3.4,myval1,myval3」而不是「1.2.3.4」,「myval1」,「myval3」,那麼使用'[join(「,」)] | @ csv'而不是'@ csv' – peak

0

這裏是一個概括Surki的做法另一種解決方案:

keys[] as $k 
| .[$k] 
| from_entries 
| [$k, .mykey1, .mykey2] 
| join(",")