如何在 jq 中将 header 添加到 CSV 导出?

How to add a header to CSV export in jq?

我正在从 jq tutorial:

中获取经过修改的命令
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' \
| jq -r -c '.[] | {message: .commit.message, name: .commit.committer.name} | [.[]] | @csv'

哪个 csv 导出良好,但缺少 header 作为顶部:

"Fix README","Nicolas Williams"
"README: send questions to SO and Freenode","Nicolas Williams"
"usage() should check fprintf() result (fix #771)","Nicolas Williams"
"Use jv_mem_alloc() in compile.c (fix #771)","Nicolas Williams"
"Fix header guards (fix #770)","Nicolas Williams"

如何在顶部添加 header(在本例中为 message,name)? (我知道可以手动操作,但是如何在 jq 内完成?)

只需在值前面的数组中添加 header 文本。

["Commit Message","Committer Name"], (.[].commit | [.message,.committer.name]) | @csv

根据 Anton 对 Jeff Mercado 的回答的评论,此代码段将获取第一个元素的属性的键名称,并将它们作为行前的数组输出,因此将它们用作 headers。如果不同的行具有不同的属性,那么它就不会很好地工作;然后,生成的 CSV 也不会。

map({message: .commit.message, name: .commit.committer.name}) | (.[0] | to_entries | map(.key)), (.[] | [.[]]) | @csv

虽然我完全意识到 OP 正在寻找 purely jq 答案,但我发现这个问题正在寻找 any 答案。所以,让我向像我一样的其他人提供我发现(并且发现有用)的一个。

  1. sudo apt install moreutils - 如果您还没有。 Moreutils website.
  2. echo "Any, column, name, that, is, not, in, your, json, object" | cat - your.csv | sponge your.csv

缺点:需要 moreutils 包,不只是 jq-依赖,所以有些人会说不够优雅,这是可以理解的。

优点:您选择 header 键,而不是 JSON 键。此外,jq 方式受到键排序的困扰,depending on your version

它是如何工作的?

  1. echo 输出你的 header
  2. cat - 从 stdin 获取 echo 输出(原因 -)并将其与您的 csv 文件合并
  3. sponge 等到完成并将结果写入同一个文件,覆盖它。

但是您可以使用 tee 来完成,而无需安装任何软件包!

不,你不能,因为 Kos excellently demonstrates here。除非你在某个时候丢失你的 csv 没问题。