以 CSV 格式打印 JSON 中的所有键和值

Printing all keys and values in a JSON in a CSV format

我有几个大的 JSON 文件需要重写到一个文件中,但我只能以一种写很多临时文件的讨厌方式来完成。让我们看一下我的问题的简化版本,example.json:

{
  "a": {
    "number": 1,
    "word": "foo"
  },
  "b": {
    "number": 2,
    "word": "bar"
  },
  "c": {
    "number": 3,
    "word": "zebra"
  }
}

我要获取:

a,1,foo
b,2,bar
c,3,zebra

我的解决方案:

jq 'keys | .[]' example.json | tr -d '"' > file1.csv
jq '.[] | .number' example.json > file2.csv
jq '.[] | .word' example.json | tr -d '"' > file3.csv

paste -d',' file1.csv file2.csv > file4.csv
paste -d',' file4.csv file3.csv > file5.csv

在上面的代码中,我知道我可以通过编写 jq -r '.[] | [.number, .word] | @csv' 而不是 jq '.[] | .word' 来进一步简化它,从而避免一半的混乱,但让我们保持这种方式,因为我的问题与管道部分。

我尝试了很多方法将 jq 的输出重定向到 paste,但我从来没有成功过:

paste <$(jq 'keys | .[]' example.json | tr -d '"') file2.csv
paste $(jq 'keys | .[]' example.json | tr -d '"') file2.csv
jq 'keys | .[]' example.json | tr -d '"') | paste file2.csv

如何将 jq 的输出放入 paste 而无需创建中间文件?

在Bash中,可以使用process substitution:

paste -d, <(jq ...) <(jq ...) <(jq ...)

请注意,粘贴接受多个文件,而不仅仅是两个。

当您可以在 jq

中完成所有操作时,为什么需要 paste 和其他一堆 shell 实用程序
jq -r 'to_entries[] | "\(.key),\(.value | .number),\(.value | .word)"' json