如何使用jq输出JSONL(每行一个独立的JSON对象)

时间:2017-02-11 17:02:11

标签: json jq jsonlines

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

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

我想要输出相同的JSONL版本,即每行一个对象,而不是数组:

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

与使用--compact-output相同,因为这会保留数组并给我:

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

提前谢谢。

3 个答案:

答案 0 :(得分:14)

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

$ jq -c '.[]'

答案 1 :(得分:0)

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

这里是使用通用方法的说明,即,它不对顶级数组中的项目做任何假设:

$ echo '[{"foo":"bar"},99,null,{"foo":"baz"}]' |
  jq -cn --stream 'fromstream( inputs|(.[0] |= .[1:]) | select(. != [[]]) )'
{"foo":"bar"}
99
null
{"foo":"baz"}
$ 

答案 2 :(得分:-1)

发现:它的

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

您还需要使用--raw-output