JQ Group_by 或 Unique 不适用于嵌套数组

问题描述 投票:0回答:1

尝试从嵌套的 JSON 数组中获取唯一条目。

JSON 来源

[
{"SIR":[{"PMD":[{"MMA":[{"DN":"One","SA":"1"},{"DN":"Two","SA":"2"}]}]}]},
{"SIR":[{"PMD":[{"MMA":[{"DN":"Two","SA":"2"},{"DN":"Four","SA":"4"}]}]}]},
{"SIR":[{"PMD":[{"MMA":[{"DN":"Three","SA":"3"},{"DN":"Five","SA":"5"}]}]}]}
]

过滤器产生非唯一结果:

'.[].SIR.PMD.MMA 
    | [.DN, .SA]
    | @csv'

电流输出(CSV

One,1
Two,2
Two,2
Three,3
Four,4
Five,5

期望的输出(CSV)

One,1
Two,2
Three,3
Four,4
Five,5
json csv jq unique distinct
1个回答
0
投票

将要过滤的项目收集到一个数组中,然后单独使用 unique 来比较整个对象,或者使用 unique_by 在任何过滤器组合上,例如.DN):

jq -r 'map(.SIR[].PMD[].MMA[]) | unique[] | [.DN, .SA] | @csv'
jq -r 'map(.SIR[].PMD[].MMA[]) | unique_by(.DN)[] | [.DN, .SA] | @csv'

请注意,输出将被排序,在第一种情况下按整个对象排序,在后者中按提供的过滤器排序。要实现样本输出的排序,请在 unique_by 上使用 .SA,或者先使用 .SA,然后使用 .DN:

jq -r 'map(.SIR[].PMD[].MMA[]) | unique_by(.SA)[] | [.DN, .SA] | @csv'
jq -r 'map(.SIR[].PMD[].MMA[]) | unique_by([.SA, .DN])[] | [.DN, .SA] | @csv'
"One","1"
"Two","2"
"Three","3"
"Four","4"
"Five","5"
© www.soinside.com 2019 - 2024. All rights reserved.