【问题标题】:Get all unique JSON key names with JQ使用 JQ 获取所有唯一的 JSON 键名
【发布时间】:2015-04-23 11:51:22
【问题描述】:

有没有一种方法可以获取所有唯一键名,而无需在 jq 之外调用唯一排序?

示例文件:

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

还有jq和我现在使用的排序命令,但我认为它不是那么有效:

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

     

【问题讨论】:

    标签: json jq


    【解决方案1】:

    当然。

    $ 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
    

    【讨论】:

    • 谢谢!我希望它比我的解决方案更节省内存,但是对于更大的文件它会崩溃: $ ls -ahgo input.json -rwx------ 1 187M Apr 24 17:40 input.json $ jq -r '键[]' 输入.json |排序 -u > 字段 $ jq -s 'map(keys) |添加 | unique' input.json > fields2 错误:无法分配内存
    • 我为更大的文件添加了更多选项。如果您仍在寻求改进,请试一试。
    【解决方案2】:

    两点:

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

    2. jq 的unique 暗示sort。即unique|sort应简化为unique以避免排序两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2021-11-10
      • 1970-01-01
      • 2018-05-15
      相关资源
      最近更新 更多