2017-03-14 96 views
0

具有下述樣品JSON輸入:JQ操縱JSON文件

{ 
    "name_A": { 
     "logfile_one": [{ 
      "issue_desc": "desiredvalueone" 
     }, { 
      "issuetime": "desiredvaluetwo" 
     }], 
     "output": ["46312"] 
    }, 
    "name_B": { 
     "logfile_two": [{ 
      "issue_desc": "desiredvaluethirtyfour" 
     }, { 
      "issuetime": "desiredvaluetwo" 
     }], 
     "output": ["1", "2"] 
    } 
} 

我們希望以下的輸出:採用t o_entries[] | .key例如

{ 
    "desiredvalueone": [{ 
     "name_A": "logfile_one" 
    }], 
    "desiredvaluetwo": [{ 
     "name_A": "logfile_one", 
     "name_B": "logfile_two" 
    }], 
    ... 
} 

,我們設法得到 「name_A」 「name_B」,但離我們試圖實現的距離很遠。或與

[to_entries[] | {"key": .key, "value": .value[]}] | from_entries 

產量

{ 
    "name_A": [ 
    "46312" 
    ], 
    "name_B": [ 
    "1", 
    "2" 
    ] 
} 
+0

請解釋一下你已經嘗試過,它有結果。 – Olaia

+0

幾個努力,幾個輸出,增加了其中兩個 – federico

回答

0

的....在給定的預期輸出引入了一些不確定性因素超出那些問題語句本身,但下面的程序做產生的結果是一致預期的輸出如圖所示。

的關鍵,這裏給出的解決方案是結合JSON對象流的輔助函數:

# Combine a stream of JSON objects into a single object 
# by converting the value v to [v] at each 
# key, and then appending the arrays at each key. 
def combine(s): 
    reduce s as $o ({}; 
    reduce ($o|keys[]) as $k (.; .[$k] += [$o[$k]] )); 

的問題,因爲我知道它現在可以使用to_entries/0三次,就可以解決;如果你不熟悉的過濾器,下面似乎相當難以理解:

combine(to_entries[] 
    | .key as $k 
    | .value 
    | to_entries[] 
    | select(.key | startswith("logfile_")) 
    | .key as $innerkey 
    | .value[] 
    | to_entries[] 
    | { (.value): { ($k): $innerkey }} 
) | map_values(add) 

與給定的輸入輸出是:

{ 
    "desiredvalueone": { 
    "name_A": "logfile_one" 
    }, 
    "desiredvaluetwo": { 
    "name_A": "logfile_one", 
    "name_B": "logfile_two" 
    }, 
    "desiredvaluethirtyfour": { 
    "name_B": "logfile_two" 
    } 
} 
0

這裏是一個解決方案,它只是假定輸入具有以下結構

{ 
    "k": { 
    "k2": [{ 
     "k3": "v" 

它通過生成格式的對象的臨時數組

{"v":"desiredvalueone","k":"name_A","k2":"logfile_one"} 

然後按.v進行分組,並按要求將數組組合並將數值 包裝在數組中。

[ 
    . as $d 
| [ 
     keys[] as $k       # e.g "name_A"... 
    | ($d[$k] | keys[] 
     | select($d[$k][.][0]|type=="object") 
     ) as $k2        # k2: "logfile_one" 
    | $d[$k][$k2][] as $v     # v: {"issue_desc":"desiredvalueone"}, 
    | ($v|keys[]) as $k3      # k3: "issue_desc" 
    | {v:$v[$k3], k:$k, k2:$k2}    # {"v":"desiredvalueone","k":"name_A","k2":"logfile_one"} 
    ] 
| group_by(.v)[] 
| reduce .[] as $t (
    {} 
    ; .[$t.v] += {($t.k): $t.k2} 
) 
] 
| add 
| map_values([.]) 

最終輸出是

{ 
    "desiredvalueone": [ 
    { 
     "name_A": "logfile_one" 
    } 
    ], 
    "desiredvaluethirtyfour": [ 
    { 
     "name_B": "logfile_two" 
    } 
    ], 
    "desiredvaluetwo": [ 
    { 
     "name_A": "logfile_one", 
     "name_B": "logfile_two" 
    } 
    ] 
}