首页 > 解决方案 > Jq tsv - 从键创建标题

问题描述

我试图让 jq 将 json 对象呈现为 tsv 格式。我遇到了一种使用键名动态生成标题的方法。

我收到此错误:

对象 ({"version":...) 在 csv 行中无效

我猜这是由于某些字段是数组:InstalledLatest. 我怎样才能使这些领域的工作?另外,为什么我的输出包括\t

电流输出:

"RELEASE\tINSTALLED\tLATEST\tOUTDATED\tDEPRECATED"
jq: error (at <stdin>:28): object ({"version":...) is not valid in a csv row

期望的输出:

RELEASE         INSTALLED    LATEST    OUTDATED      DEPRACATED
test-app        1.0.0        2.0.0     true          false    
test-app2       3.0.0        3.5.0     true          false 

jq

cat test1.json | jq '[.[]| with_entries( .key |= ascii_upcase ) ] | (.[0] |keys_unsorted | @tsv), (.[]|.|map(.) |@tsv)'

json:

[
  {
    "release": "test-app",
    "Installed": {
      "version": "1.0.0",
      "appVersion": ""
    },
    "Latest": {
      "version": "2.0.0",
      "appVersion": ""
    },
    "outdated": true,
    "deprecated": false
  },
  {
    "release": "test-app2",
    "Installed": {
      "version": "3.0.0",
      "appVersion": ""
    },
    "Latest": {
      "version": "3.5.0",
      "appVersion": ""
    },
    "outdated": true,
    "deprecated": false
  }
]

标签: jsonbashjq

解决方案


首先是让你的鸭子排成一排:

map({release, installed: .Installed.version, latest: .Latest.version, deprecated})

现在标题很简单:

( .[0] | keys_unsorted | map(ascii_upcase))

...并且使用 .[] 来获取值是安全的:

.[] | [.[]]

把它们放在一起:

map({release, installed: .Installed.version, latest: .Latest.version, deprecated})
| ( .[0] | keys_unsorted | map(ascii_upcase)),
  (.[] | [.[]])
| @tsv

标题下的一行破折号

在您在Jq tsv error in formatting an array/object的相关问题中,您需要在标题下添加一行破折号。

要自动生成这样一行,请参阅 如何使用 jq 将 JSON 字符串格式化为表格?


推荐阅读