访问输入文件名数组(或以其他方式仅输出一次CSV头)

访问输入文件名数组(或以其他方式仅输出一次CSV头),csv,jq,Csv,Jq,我使用多个结构相同的json文件作为输入运行jq,以输出单个CSV流,jq脚本的结尾如下: | (map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | if (input_filename == "first-file.json" then $cols, $rows[] else $rows[] end | @csv 其中第三行是为了避免对每个JSON文件重

我使用多个结构相同的json文件作为输入运行jq,以输出单个CSV流,jq脚本的结尾如下:

| (map(keys) | add | unique) as $cols
| map(. as $row | $cols | map($row[.])) as $rows
| if (input_filename == "first-file.json" then $cols, $rows[] else $rows[] end
| @csv

其中第三行是为了避免对每个JSON文件重复CSV头。这是一个丑陋的黑客,因为它硬编码的第一个输入文件名。我想改为使用
input\u filenames[0]
,但是没有这样的全局属性,或者我缺少了它?或者是否有其他更简洁的方法来避免在输出CSV中重复标题行?

此响应仅解决查找以下内容的问题:

仅输出CSV头一次的方法

一种方法是使用
input
处理第一个JSON实体,然后使用
inputs
处理其余的JSON实体,所有这些都使用jq的-n命令行选项

input
| . as $in
| (map(keys_unsorted) | add | unique) as $cols
| $cols,
  (($in, inputs) | map(. as $row | $cols | map($row[.])))


另请注意,此处使用了未排序的
键。

此响应仅解决查找以下项的问题:

仅输出CSV头一次的方法

一种方法是使用
input
处理第一个JSON实体,然后使用
inputs
处理其余的JSON实体,所有这些都使用jq的-n命令行选项

input
| . as $in
| (map(keys_unsorted) | add | unique) as $cols
| $cols,
  (($in, inputs) | map(. as $row | $cols | map($row[.])))


另请注意此处使用的
keys_unsorted

您可以共享两个JSON文件的最小示例吗?file1.JSON:[{“foo”:1,“bar”:2},{“foo”:3,“bar”:4}]file2.JSON:[{“foo”:5,“bar”:6}]调用为:jq-r-f script.jq文件*.JSON您可以共享两个JSON文件的最小示例吗?file1.JSON:[{“foo”:1,“bar”:2}{“foo”:3,“bar”:4}]file2.json:[{“foo”:5,“bar”:6}]调用为:jq-r-f script.jq文件*.jsontanks,这非常接近,但会产生:[“bar”,“foo”][[2,1],[4,3][[6,5]],嵌套的borks@csv在csv行中无效,错误为“array([2,1])“所以还不太清楚:)谢谢,这非常接近,但会产生:[“bar”,“foo”][[2,1],[4,3]][[6,5]]和嵌套borks@csv,错误为“数组([2,1])在csv行中无效”,所以还不太清楚:)