如何控制数组的JQ显示输出格式

时间:2017-04-27 18:55:04

标签: jq

我想让JQ在一行上打印出数组。我的输入是一个我想要规范化的Avro架构。这主要是为了在我们改进模式时以一种有助于简化Git差异的方式规范化输出。我能够使用这样的过滤器来控制字段的顺序,但是如何强制将数组强制为单行。输出的格式似乎受JQ的控制。

jq '{name: .name, fields: .fields | map({ name: .name, type: .type})}' my.json

我希望能够显示:

{
  "name": "rm",
  "fields": [
    {
      "name": "stat_1",
      "type": "long"
    },
    {
      "name": "stat_2",
      "type": [
        "long",
        "null"
      ]
    }
  ]
}
像这样:

{
  "name": "rm",
  "fields": [
    {
      "name": "stat_1",
      "type": "long"
    },
    {
      "name": "stat_2",
      "type": ["long", "null"]  << FLATTENED
    }
  ]
}

1 个答案:

答案 0 :(得分:0)

由于你的目的是让比较更简单,这就是我的建议,即使它不是你想要的:

walk(if type == "array" and all(.[]|type; . != "array" and . != "object")
     then tostring else . end)

这具有展平标量数组所需的效果,但它通过将它们转换为字符串来实现:

{
  "fields": [
    {
      "name": "stat_1",
      "type": "long"
    },
    {
      "name": "stat_2",
      "type": "[\"long\",\"null\"]"
    }
  ],
  "name": "rm"
}

变体

如果你的jq有isempty(或者如果你不介意添加它的定义,例如你的〜/ .jq),上面的内容可以简化为:

walk(if type == "array" and isempty(.[]|iterables) then tostring else . end)

的isEmpty

如果您的jq没有isempty,则其定义如下:

def isempty(g): 0 == ((label $go | g | (1, break $go)) // 0);