如何在jq中为CSV导出添加标题?

Ant*_*nko 13 csv json jq

我正在从jq 教程中修改命令:

curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' \
| jq -r -c '.[] | {message: .commit.message, name: .commit.committer.name} | [.[]] | @csv'
Run Code Online (Sandbox Code Playgroud)

哪个csv导出很好,但错过了标题作为顶部:

"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"
Run Code Online (Sandbox Code Playgroud)

如何message,name在顶部添加标题(在本例中)?(我知道它可以手动,但如何在内部进行jq?)

Jef*_*ado 19

只需在值前面的数组中添加标题文本即可.

["Commit Message","Committer Name"], (.[].commit | [.message,.committer.name]) | @csv
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,杰夫!如果必须修改所选列,是否有任何方法可以在不重复标题的情况下处理案例? (2认同)

小智 7

根据Anton对Jeff Mercado的回答的评论,这段代码将获取第一个元素的属性的关键名称,并在行之前将它们作为数组输出,从而将它们用作标题.如果不同的行具有不同的属性,那么它将无法正常工作; 然后再次,结果CSV也不会.

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

  • 非常感谢,圣地亚哥!我只是发现该方法按名称对标题进行排序,但不对相应的列进行排序。有什么办法可以避免这种情况? (2认同)