使用 JQ 获取所有唯一的 JSON 键名
Get all unique JSON key names with 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
当然可以。
$ 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
两点:
调用jq然后排序的原始解决方案是有效的,尤其是在内存使用方面。 (涉及 -s 选项的解决方案有效地强制将整个文件读入内存)。
jq的unique
表示sort
。即unique|sort
应该简化为unique
以避免排序两次
有没有办法获取所有唯一的键名,而无需在 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
当然可以。
$ 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
两点:
调用jq然后排序的原始解决方案是有效的,尤其是在内存使用方面。 (涉及 -s 选项的解决方案有效地强制将整个文件读入内存)。
jq的
unique
表示sort
。即unique|sort
应该简化为unique
以避免排序两次