是否可以转换这个json:
[
{
"bytes": 276697,
"checked": false
},
{
"bytes": 276697,
"checked": false
}
]
到 jq 中带有标题的表?
我试过了:
cat file.json | jq '.[] | join(",")'
但它省略了标题:
"276697,false"
"276697,false"
它应该是:
"bytes,checked"
"276697,false"
"276697,false"
我希望您只需运行两个命令:
cat file.json | jq '.[] | keys, .[] | join(",")'
但第二个失败了:
"bytes,checked"
jq: error (at <stdin>:64): Cannot iterate over null (null)
理想情况下它会比这更简单。
您可以从列表中第一个元素的键中选择标题作为字符串数组,然后将所有元素的值提取为单独的数组。将
@csv
输出运算符应用于结果列表的每个元素将以 CSV 形式引用数据(jq
引用所有字符串,但不引用布尔值或数字):或者,
或者,
或任何其他方式将值提取到单独的数组中。
请注意,这依赖于整个输入数据中的键以相同的顺序出现。
然而,使用Miller ( )则更容易
mlr
:这只是通过 Miller 的命令传递数据
cat
(这样使用时,不会修改数据),同时使用选项--j2c
(缩写--ijson --ocsv
)将数据从 JSON 转换为 CSV。请注意,由于 Miller 能够正确识别 CSV,因此它仅引用实际需要引用的字段。您还可以通过选择漂亮的打印输出格式以及以下命令来获得格式良好的表格
--barred
:(
--j2p
是 的缩写--ijson --opprint
。)或者没有
--barred
:我得到了它:
看起来你可以将任何部分放在括号中,以防止它“消耗”流(我不知道这是否是它的名字,或者即使我在这里得到它,因为我在 jq 的文档中找不到任何内容并且有将所有内容与分散在各个博客和 stackoverflow 中的零碎内容拼凑在一起,因此,如果有“正确”的方法来做到这一点,请告诉我)。
顺便说一句,如果你有一个像我一样的 shell for 循环,使用 -s 选项来组合单独的 json 对象: