【问题标题】:How to print JSON in tabular format using jq如何使用 jq 以表格格式打印 JSON
【发布时间】:2021-12-14 16:48:32
【问题描述】:

假设我有以下 JSON:

{
  "Data": [
    {
      "VarCharValue": "date"
    },
    {
      "VarCharValue": "time"
    }
  ],
  "Data": [
    {
      "VarCharValue": "12-13-2021"
    },
    {
      "VarCharValue": "23:22:33"
    }
  ]
}

我想将其转换为更传统的逗号分隔日志格式,例如:

Date,Time
12-13-2021,23:22:33

似乎第一步是在这种情况下删除无用的键,使其看起来像:

{
  "Data": [
      "date",
      "time"
  ],
  "Data": [
      "12-13-2021",
      "23:22:33"
  ]
}

我已通读文档和手册,但无法弄清楚这部分内容。

接下来是将数组从对象中拉出并显示为 CSV,我可以这样做: jq -r .Data | @csv

任何人都可以帮忙移除这里的钥匙吗?

【问题讨论】:

  • 您发布的 JSON 在语法上是有效的,但由于密钥重复而非常可疑。使用 jq 处理这种情况是可能的,但相当困难,所以在麻烦之前,您能否检查一下您是否真的必须处理这种异常情况?
  • 这是一次性的,但您的建议成功了,再次感谢@peak!

标签: jq


【解决方案1】:

使用您非常可疑的 JSON,以下会产生您想要的结果,但标题除外:

jq -r '[.Data[][]] | join(",")' weird.json

如果您希望保证结果为 CSV,请使用 @csv 而不是 join。你也可以考虑@tsv

添加标题很容易,所以我将把它留给您,尤其是当存在更难处理的潜在问题时。例如,如果两个“Data”键值对以不同的顺序呈现,或者如果您需要使用第一个“Data”值中的顺序来确定值的正确顺序,上述操作将无法正常工作在第二个“数据”值中。

【讨论】:

  • 我的jq (jq-1.6) 在处理任何内容之前折叠重复的字段,因此只会到达最后一个实例,即12-13-2021,23:22:33。但是,使用 --stream 可以,例如jq --stream -sr 'map(last | strings) | (length/2) as $m | .[:$m], .[$m:] | @csv' weird.json
  • 谢谢@peak - 它对我有用。您有机会解释一下您的解决方案是如何工作的,以便我理解吗?
  • 是的,可疑的 JSON 同意了。这就是 AWS Athena 通过 CLI 响应查询的方式,信不信由你。我试图弄清楚你做了什么。看起来 .Data 周围的括号意味着我们正在创建一个新数组。我不知道为什么这是必要的,但它肯定是。 .Data 之后的第一对括号返回 .Data 对象中所有键值对的单个数组。第二对括号删除键值对中的键。我不明白这部分。
  • @user2690966 - .[] 适用于数组和对象。 join/1@csv@tsv 都期望数组作为输入。您可以使用debug 查看幕后发生的事情。向 AWS Athena 投诉是否值得?
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多