加入 jq 数组,用于 CSV 输出

joining jq arrays, for CSV output

我正在寻找基于两个 json 数组的 CSV(数组是具有键值对的大型 jason 数组的缩减)

[
  "Name",
  "Role",
  "Type",
  "Service",
  "Group",
]
[
  "some-server.com",
  "web server",
  "production",
  "apps",
  "main",
]

我可以通过以下方式得到更少的东西:

jq -r '[.Tags[].Key], [.Tags[].Value] | join (",")' output.json

问题是,键并不总是按相同的顺序排序。对于某些对象,我得到:

Name, Role, Type

其他时间:

Role, Type Name ..

我正在寻找一种使输出一致的方法。

您可以使用以下方法规范化对象:

def sortKeys: to_entries | sort | from_entries

例如,如果 A 是非规范化对象的数组,您可以这样写:

A | map(sortKeys)

或者对象可以在创建后立即规范化。

对于 CSV,您可能希望根据预先确定的键名数组来确定顺序。在这种情况下,您可以使用:

def selectKeys(keys):
  . as $in | reduce keys[] as $k ({}; . + {($k): $in[$k]})