34

我的请求听起来微不足道,但我找不到办法。我有一个 JSON 对象数组作为输入:

[
    {
        "foo": 1,
        "bar": 2
    },
    {
        "foo": 3,
        "bar": 4
    },
    (...)
]

我希望输出相同的 JSONL 版本,也就是每行一个对象,而不是数组:

    { "foo": 1, "bar": 2 }
    { "foo": 3, "bar": 4 }
    (...)

using 不同--compact-output,因为它会保留数组并给我:

    [ { "foo": 1, "bar": 2 }, { "foo": 3, "bar": 4 }, (...) ]

先感谢您。

4

3 回答 3

39

原始问题的答案是将过滤器.[]-c命令行选项一起使用:

$ jq -c '.[]'
于 2017-02-11T17:13:36.870 回答
1

如果输入数组太大而无法放入内存,可以使用 jq 所谓的“流式解析器”。

这是一个使用通用方法的插图,也就是说,它不对顶级数组中的项目做任何假设:

$ echo '[{"foo":"bar"},99,null,{"foo":"baz"}]' |
  jq -cn --stream 'fromstream( inputs|(.[0] |= .[1:]) | select(. != [[]]) )'
{"foo":"bar"}
99
null
{"foo":"baz"}
$ 
于 2020-03-31T23:02:09.283 回答
-2

发现:是

map(tostring) | reduce .[] as $item (""; . + $item + "\n")

您还需要使用--raw-output.

于 2017-02-11T17:07:47.580 回答