如何使用 jq 将 JSON 字符串格式化为表格?

Vel*_*nov 8 json jq

我需要使用 jq 将 JSON 字符串转换为表格格式,以便在终端中显示输出,如下所示。

{
  "results": [
    [
      {
        "field": "@timestamp",
        "value": "2023-07-03 08:28:00.000"
      },
      {
        "field": "CpuReserved",
        "value": "8192.0"
      },
      {
        "field": "CpuUtilized",
        "value": "4056.412942708333"
      },
      {
        "field": "MemoryReserved",
        "value": "61440"
      },
      {
        "field": "MemoryUtilized",
        "value": "4311"
      },
      {
        "field": "@ptr",
        "value": "CpABClUKUTE0NjcxNzAzNzI0NzovYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9pcmwtaW5mcmEtc2hhcmVkLWplbmtpbnMtbWFpbi9wZXJmb3JtYW5jZRABEjUaGAIGSaxosQAAAAAd+TFeAAZKKHIwAAABEiABKIDF9taRMTDA7v3WkTE4BkC9NEjNPFCBIRgAEAAYAQ=="
      }
    ],
    [
      {
        "field": "@timestamp",
        "value": "2023-07-03 08:28:00.000"
      },
      {
        "field": "CpuReserved",
        "value": "8192.0"
      },
      {
        "field": "CpuUtilized",
        "value": "4056.412942708333"
      },
      {
        "field": "MemoryReserved",
        "value": "61440"
      },
      {
        "field": "MemoryUtilized",
        "value": "4311"
      },
      {
        "field": "@ptr",
        "value": "CpABClUKUTE0NjcxNzAzNzI0NzovYXdzL2Vjcy9jb250YWluZXJpbnNpZ2h0cy9pcmwtaW5mcmEtc2hhcmVkLWplbmtpbnMtbWFpbi9wZXJmb3JtYW5jZRABEjUaGAIGSaxosQAAAAAd+TFeAAZKKHIwAAABEiABKIDF9taRMTDA7v3WkTE4BkC9NEjNPFCBIRgAEAEYAQ=="
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想在终端中显示的内容如下:

@timestamp                CpuReserved  CpuUtilized         MemoryReserved   MemoryUtilized  
==========================================================================================
2023-07-03 08:16:00.000   8192.0       410.5300065104166   61440            1417
2023-07-03 08:15:00.000   8192.0       702.310791015625    61440            792

Run Code Online (Sandbox Code Playgroud)

有人可以引导我走向正确的方向吗?

Sté*_*las 12

或许:

\n
$ jq -c \'.results[]|map(.key=.field)|from_entries|del(."@ptr")\' file.json |\n   mlr --ijson --opprint --barred cat\n+-------------------------+-------------+-------------------+----------------+----------------+\n| @timestamp              | CpuReserved | CpuUtilized       | MemoryReserved | MemoryUtilized |\n+-------------------------+-------------+-------------------+----------------+----------------+\n| 2023-07-03 08:28:00.000 | 8192.0      | 4056.412942708333 | 61440          | 4311           |\n| 2023-07-03 08:28:00.000 | 8192.0      | 4056.412942708333 | 61440          | 4311           |\n+-------------------------+-------------+-------------------+----------------+----------------+\n
Run Code Online (Sandbox Code Playgroud)\n

如果没有--barred,看起来像:

\n
\n @\xcc\xb2t\xcc\xb2i\xcc\xb2m\xcc\xb2e\xcc\xb2s\xcc\xb2t\xcc\xb2a\xcc\xb2m\xcc\xb2p\xcc\xb2 C\xcc\xb2p\               xcc \xb2u\xcc\xb2R\xcc\xb2e\xcc\xb2s\xcc\xb2e\xcc\xb2r\xcc\xb2v\xcc\xb2e\xcc\xb2d\xcc\xb2  C\xcc\xb2p\xcc\xb2u\xcc\ xb2U\xcc\xb2t\xcc\xb2i\xcc\xb2l\xcc\xb2i\xcc\xb2z\xcc\xb2e\xcc\xb2d\xcc\xb2        M\xcc\xb2e\xcc\xb2m\xcc\xb2o\xcc\xb2r \xcc\xb2y\xcc\xb2R\xcc\xb2e\xcc\xb2s\xcc\xb2e\xcc\xb2r\xcc\xb2v\xcc\xb2e\xcc\xb2d\xcc\xb2 M\xcc\xb2e\xcc\xb2m  \ xcc\xb2o\xcc\xb2r\xcc\xb2y\xcc\xb2U\xcc\xb2t\xcc\xb2i\xcc\xb2l\xcc\xb2i\xcc\xb2z\xcc\xb2e\xcc\xb2d\xcc\xb2\ n2023- 07-03 08:28:00.000 8192.0 4056.412942708333 61440 4311\n2023-07-03 08:28:00.000 8192.0 4056.412942708333 61440 4311\n
\n

您还可以将该命令的输出通过管道传输jqvd -f json( VisiData ) 而不是mlr( Miller ) 以获取交互式表查看器。

\n

它们用于jq提取信息并且mlr仅用于格式化表格。的功能集jq和 的功能集之间存在一些重叠mlr。例如,您还可以删除@ptr带有mlr\'s的列cut

\n
jq -c \'.results[]|map(.key=.field)|from_entries\' file.json |\n  mlr --ijson --opprint cut -xf @ptr\n
Run Code Online (Sandbox Code Playgroud)\n

jq命令被分解并评论:

\n
jq -c \'\n  .results[] | # iterate over the elements of the .results array \n               # (which are also arrays)\n\n  map(.key=.field) | # for each of those arrays, transform the\n                     # elements (which are objects) by adding a \n                     # field of key "key" with same value as that\n                     # with "field" key in each, as that\'s what\n                     # from_entries needs\n\n  from_entries | # transforms those [{"key":"foo","value":"bar"}]\n                 # (the "field" field is ignored) to {"foo":"bar"}\n\n  del(."@ptr") # deletes the field with key "@ptr" from those\n               # objects\' file.json\n
Run Code Online (Sandbox Code Playgroud)\n

结果不是 JSON,而是多个 JSON 连接在一起,但两者jqmlr支持。对于-c(compact),这就是 NDJSON(换行符分隔的 JSON),其中每行一个 JSON,也受vd. 为了获得正确的 JSON,我们需要:

\n
jq -c \'.results|map(map(.key=.field)|from_entries|del(."@ptr"))\' file.json\n
Run Code Online (Sandbox Code Playgroud)\n

map我们在数组上使用它.results,因此它会生成另一个 JSON 数组,而不是迭代元素。所以最终的结果是一个大数组。这也得到了支持jq(显然这是正确的 JSON),mlr并且vd, 的输入时间有点长,意味着这些工具需要]在有任何东西可以咀嚼之前读取到最后的结尾。在实践中,我还没有检查这是否对性能产生任何影响。

\n