使用JQ获取所有唯一的JSON密钥名称

时间:2015-04-23 11:51:22

标签: json jq

有没有办法获取所有唯一的键名,而无需在jq外调用唯一的排序?

示例文件:

{"a": 1, "b": 2, "c": 3}
{"a": 4, "b": 5, "d": 6}

现在使用jq和sort命令,但我觉得它效率不高:

jq -r keys[] example | sort -u                                                                               
a                                                                                                                                       
b                                                                                                                                       
c                                                                                                                                       
d     

2 个答案:

答案 0 :(得分:7)

当然。

$ jq -n '[inputs | keys[]] | unique | sort' input.json
[
  "a",
  "b",
  "c",
  "d"
]

这是另一个可能表现更好的选项,因为它不需要将密钥收集到数组中。

$ jq -n 'reduce (inputs | keys[]) as $k ({}; .[$k] = null) | keys' input.json

或许,甚至更好:

$ jq -n 'foreach (inputs | keys[]) as $k ({}; .[$k]+=1; if .[$k]==1 then $k else empty end)' input.json

对于较大的文件,您仍然希望将它们流式传输,因此请使用以下变体:

$ jq --stream -n 'foreach inputs[0][-1] as $k ({}; .[$k]+=1; if .[$k]==1 then $k else empty end)' input.json

答案 1 :(得分:2)

两点:

  1. 调用jq然后排序的原始解决方案是高效的,特别是在内存使用方面。 (涉及-s选项的解决方案有效地强制将整个文件读入内存)。

  2. jq' unique隐含sort。也就是说,unique|sort应简化为unique,以避免排序两次。