【问题标题】:Unique combinations of different values in json using jq使用jq在json中不同值的唯一组合
【发布时间】:2017-02-27 06:25:22
【问题描述】:

我有一个 json 文件(input.json),看起来像这样:

{"header1":"a","header2":1a, "header3":1a, "header4":"apple"},
{"header1":"b","header2":2a, "header3":2a, "header4":"orange"}
{"header1":"c","header2":1a, "header3":2a, "header4":"banana"},
{"header1":"d","header2":2a, "header3":1a, "header4":"apple"},
{"header1":"a","header2":2a, "header3":1a, "header4":"banana"},
{"header1":"b","header2":1a, "header3":2a, "header4":"orange"},
{"header1":"b","header2":1a, "header3":1a, "header4":"orange"},
{"header1":"d","header2":1a, "header3":1a, "header4":"apple"},
{"header1":"a","header2":2a, "header3":1a, "header4":"banana"} (repeat of line 5)

我只想过滤掉每个 jq 值的唯一组合。 结果应如下所示:

{"header1":"a","header2":1a, "header3":1a, "header4":"apple"},
{"header1":"b","header2":2a, "header3":2a, "header4":"orange"}
{"header1":"c","header2":1a, "header3":2a, "header4":"banana"},
{"header1":"d","header2":2a, "header3":1a, "header4":"apple"},
{"header1":"a","header2":2a, "header3":1a, "header4":"banana"},
{"header1":"b","header2":1a, "header3":2a, "header4":"orange"},
{"header1":"b","header2":1a, "header3":1a, "header4":"orange"},
{"header1":"d","header2":1a, "header3":1a, "header4":"apple"}

我尝试将 header1 与其他标题进行分组,但它没有产生独特的结果。 我使用了unique,但没有产生正确的结果。

我怎样才能得到这个?我是 jq 新手,没有找到很多关于它的教程。

谢谢

【问题讨论】:

    标签: arrays json bash unique jq


    【解决方案1】:
    1. 您提供的示例行不是有效的 JSON。由于您的序言将它们介绍为 JSON,因此以下内容将假设您打算呈现 JSON 对象数组。

    2. 这个问题在几个方面都不清楚,但从这个例子看来,unique 可能就是你要找的东西,所以考虑一下:

    调用:jq -c 'unique[]' input.json

    输出:

    {"header1":"a","header2":"1a","header3":"1a","header4":"apple"}
    {"header1":"a","header2":"2a","header3":"1a","header4":"banana"}
    {"header1":"b","header2":"1a","header3":"1a","header4":"orange"}
    {"header1":"b","header2":"1a","header3":"2a","header4":"orange"}
    {"header1":"b","header2":"2a","header3":"2a","header4":"orange"}
    {"header1":"c","header2":"1a","header3":"2a","header4":"banana"}
    {"header1":"d","header2":"1a","header3":"1a","header4":"apple"}
    {"header1":"d","header2":"2a","header3":"1a","header4":"apple"}
    
    1. 如果您需要其他格式的输出,也可以使用 jq 来完成,但要求不是很明确,所以让我们将其作为练习 :-)

    【讨论】:

    • 更新了我的问题,请再次查看。我想通过仅选择这些特定键来生成每个值的唯一组合
    【解决方案2】:

    由于peak 表明您的输入不是合法的 JSON,我冒昧地对其进行了更正并将其转换为单个对象的列表:

    {"header1":"a","header2":"1a", "header3":"1a", "header4":"apple"}
    {"header1":"b","header2":"2a", "header3":"2a", "header4":"orange"}
    {"header1":"c","header2":"1a", "header3":"2a", "header4":"banana"}
    {"header1":"d","header2":"2a", "header3":"1a", "header4":"apple"}
    {"header1":"a","header2":"2a", "header3":"1a", "header4":"banana"}
    {"header1":"b","header2":"1a", "header3":"2a", "header4":"orange"}
    {"header1":"b","header2":"1a", "header3":"1a", "header4":"orange"}
    {"header1":"d","header2":"1a", "header3":"1a", "header4":"apple"}
    {"header1":"a","header2":"2a", "header3":"1a", "header4":"banana"}
    

    如果此数据在 data.json 中并且您运行

    jq -M -s -f filter.jq data.json
    

    以下filter.jq

    foreach .[] as $r (
      {}
    ; ($r | map(.)) as $p | if getpath($p) then empty else setpath($p;1) end
    ; $r
    )
    

    它将按原始顺序生成以下输出,没有重复。

    {"header1":"a","header2":"1a","header3":"1a","header4":"apple"}
    {"header1":"b","header2":"2a","header3":"2a","header4":"orange"}
    {"header1":"c","header2":"1a","header3":"2a","header4":"banana"}
    {"header1":"d","header2":"2a","header3":"1a","header4":"apple"}
    {"header1":"a","header2":"2a","header3":"1a","header4":"banana"}
    {"header1":"b","header2":"1a","header3":"2a","header4":"orange"}
    {"header1":"b","header2":"1a","header3":"1a","header4":"orange"}
    {"header1":"d","header2":"1a","header3":"1a","header4":"apple"}
    

    注意

    ($r | map(.))
    

    用于生成仅包含每一行的值的数组 假定总是产生唯一的密钥路径。这是真的 样本数据,但对于更复杂的值可能不正确。

    一个更慢但更健壮的filter.jq

    foreach .[] as $r (
      {}
    ; [$r | tojson] as $p | if getpath($p) then empty else setpath($p;1) end
    ; $r
    )
    

    它使用整个行的 json 表示作为唯一键来确定之前是否已经看到了一行。

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      相关资源
      最近更新 更多