jq操作json文件
以下为示例json的输入:jq操作json文件,json,jq,Json,Jq,以下为示例json的输入: { "name_A": { "logfile_one": [{ "issue_desc": "desiredvalueone" }, { "issuetime": "desiredvaluetwo" }], "output": ["46312"] }, "name_B": { "logfile_two": [{
{
"name_A": {
"logfile_one": [{
"issue_desc": "desiredvalueone"
}, {
"issuetime": "desiredvaluetwo"
}],
"output": ["46312"]
},
"name_B": {
"logfile_two": [{
"issue_desc": "desiredvaluethirtyfour"
}, {
"issuetime": "desiredvaluetwo"
}],
"output": ["1", "2"]
}
}
我们希望获得以下输出:
{
"desiredvalueone": [{
"name_A": "logfile_one"
}],
"desiredvaluetwo": [{
"name_A": "logfile_one",
"name_B": "logfile_two"
}],
...
}
例如,使用to_entries[]|.key
,我们设法获得“name_A
”
“name_B
”,但与我们试图实现的目标相去甚远。或与
[to_entries[] | {"key": .key, "value": .value[]}] | from_entries
产量为
{
"name_A": [
"46312"
],
"name_B": [
"1",
"2"
]
}
那个。。。。在给定的预期输出中,除了问题陈述本身中的不确定性外,还引入了一些不确定性,但以下程序确实产生了与预期输出一致的结果,如图所示 这里给出的解决方案的关键是用于组合JSON对象流的helper函数:
# 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"
}
}
这里是一个只假设输入具有以下结构的解决方案
{
"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"
}
]
}
请解释你的尝试和结果。几次努力,几次产出,增加了两次