【问题标题】:jq streaming eats first element, why?jq 流吃掉第一个元素,为什么?
【发布时间】:2022-10-04 16:00:19
【问题描述】:

在流模式下使用 jq 时(因为 100 GB 文件),它会吃掉第一个元素。我怎样才能避免这种情况?

echo [{"id":482,"a":"2","b":1},{"id":483,"a":"3","b":2}] | jq  -c --stream "fromstream(1|truncate_stream(inputs))"

输出是

{"a":"2","b":1}
{"id":483,"a":"3","b":2}

第一个数组元素中缺少第一个元素 (id)。

这是jq 1.6版。它在 Windows 2010 上,但同样的行为也在 Ubuntu 22.04 上的 jq 1.6 上。

谢谢

【问题讨论】:

    标签: json jq


    【解决方案1】:

    这似乎是因为您将inputs--stream 一起使用。

    $ echo '[{"id":482,"a":"2","b":1},{"id":483,"a":"3","b":2}]' 
    | jq  -c --stream 'inputs'
    [[0,"a"],"2"]
    [[0,"b"],1]
    [[0,"b"]]
    [[1,"id"],483]
    [[1,"a"],"3"]
    [[1,"b"],2]
    [[1,"b"]]
    [[1]]
    

    使用 . 似乎更好,但我不确定你在追求什么:

    $ echo '[{"id":482,"a":"2","b":1},{"id":483,"a":"3","b":2}]' 
    | jq  -c --stream '. as $i | (1 | truncate_stream($i))'
    [["id"],482]
    [["a"],"2"]
    [["b"],1]
    [["b"]]
    [["id"],483]
    [["a"],"3"]
    [["b"],2]
    [["b"]]
    

    【讨论】:

      【解决方案2】:

      使用--null-input(或-n)标志。这样标准输入设置为nullinputs 可以获取所有实际输入。

      jq -cn --stream "fromstream(1|truncate_stream(inputs))"
      
      {"id":482,"a":"2","b":1}
      {"id":483,"a":"3","b":2}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 2013-06-15
        • 2017-12-18
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        相关资源
        最近更新 更多