【问题标题】:How to control JQ display output format for arrays如何控制数组的 JQ 显示输出格式
【发布时间】:2017-04-27 18:55:03
【问题描述】:

我想让 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
    }
  ]
}

【问题讨论】:

标签: jq


【解决方案1】:

由于您的目的是使比较更简单,因此我建议您这样做,即使这并不是您想要的:

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)

空

如果你的 jq 没有isempty,这里是它的定义:

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

【讨论】:

  • 谢谢,这是一种有趣的方法,但我不一定喜欢字符串表示的副作用。
猜你喜欢
  • 1970-01-01
  • 2021-12-02
  • 2010-12-08
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多