【问题标题】:How to pretty print using jq, so that multiple values are on the same line?如何使用 jq 进行漂亮的打印,以便多个值在同一行上?
【发布时间】:2017-10-18 08:29:07
【问题描述】:

我从 jq 得到的是:

{
  "frameGrid": {
    "size": [
      24,
      24
    ],
    "dimensions": [
      1,
      1
    ],
    "names": [
      [
        "default"
      ]
    ]
  }
}

我希望看到的更像是这样的:

{
  "frameGrid": {
    "size": [24,24], 
    "dimensions": [1,1],
    "names": [["default"]]
  }
}

我知道这两种形式都有效,并且 jq 具有紧凑/漂亮的打印模式。但是中间有什么东西吗?我正在寻找以某种方式格式化一个更大的 json 文件,该文件具有比这更多的数组值,以便它易于阅读和打印。也许我只是在这项工作中使用了错误的工具?

(请原谅可怕的格式选择。似乎代码示例不太喜欢 json 格式)

【问题讨论】:

  • 为所描述的那种类型的漂亮打印机编写 jq 代码需要大量的工作。您最好的选择可能是使用诸如npmjs.com/package/json-stringify-pretty-compact 之类的工具
  • 谢谢@JeffMercado。虽然目标不完全相同,但它确实适合 PP 打字的同一领域。我认为结合您的信息和此处提供的信息可能会帮助其他人确定一个通用的解决方案。你们真棒!在发布这个问题之前,我确实搜索过这种性质的东西。

标签: json formatting jq pretty-print


【解决方案1】:

虽然最好使用类似peak 建议的工具,但如果您的 json 不太复杂,您可以使用第二个 jq 调用对第一个的输出进行后处理。例如,如果您的数据位于data.json

$ jq -M . data.json | jq -MRsr 'gsub("\n      +";"")|gsub("\n    ]";"]")'

生产

{
  "frameGrid": {
    "size": [24,24],
    "dimensions": [1,1],
    "names": [["default"]]
  }
}

【讨论】:

  • 虽然它不能在没有大量处理时间的情况下处理更大的文件结构,但它确实在 jq 中工作,而且它似乎根本没有中断。我不需要经常运行这些报告,所以这个解决方案到目前为止运行良好!虽然我喜欢 awk 的答案,但这仍然适用于问题的主题。希望我能选择你们两个。
【解决方案2】:

正如@jq170727 所提到的,在jq 的漂亮打印运行(例如jq .)之后的后处理值得考虑。在这种情况下,这里有一个 awk 脚本可能就足够了:

#!/bin/bash

awk '
  function ltrim(x) { sub(/^[ \t]*/, "", x); return x; }
  s && NF > 1 && $NF == "["  { s=s $0;               next}
  s && NF == 1 && $1 == "]," { print s "],";   s=""; next}
  s && NF == 1 && $1 == "["  { print s;        s=$0; next}
  s && NF == 1 && $1 == "{"  { print s; print; s=""; next}
  s && NF == 1 && $1 == "]"  { print s $1;     s=""; next}
  s && NF == 1 && $1 == "}"  { print s;        s=$0; next}
  s                          { s=s ltrim($0);        next}
  $NF == "["                 { s=$0;                 next}
  {print}
'

示例

使用示例输入,调用:

 jq . example.json | ./pp

产生:

{
  "frameGrid": {
    "size": [24,24],
    "dimensions": [1,1],
    "names": [
      ["default"]
    ]
  }
}

调用:

jq -n '{a:[1,2,3,[1,2,3,4]],b:2,c:{d:[1,2,{e:[3,4]}]}}' | ./pp

产生:

{
  "a": [1,2,3,
    [1,2,3,4]
  ],
  "b": 2,
  "c": {
    "d": [1,2,
      {
        "e": [3,4]
      }
    ]
  }
}

【讨论】:

  • 你们两个人的回答对我帮助很大,我真的很感谢你们!我想如果我的数据集变得更大,我会转向 awk。但就目前而言,jq 补救措施运行良好。
【解决方案3】:

如果您没有与 jq 结婚,请查看FracturedJson。有一个基于 Web 的格式化程序、一个命令行应用程序和几个库。

FracturedJson 内联数组/对象,只要它们既不太长也不太复杂(根据您的设置)。如果它们不太复杂,它还可以将数组作为多行,每行包含多个项目。否则,它会以经典的缩进形式破坏事物。

这是使用默认设置的原始问题的数据:

{
    "frameGrid": {
        "size": [24, 24],
        "dimensions": [1, 1],
        "names": [ ["default"] ]
    }
}

披露:我是 FracturedJson 的作者。它是在 MIT 许可下开源的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多