json jq:使用流和不

6rqinv9w  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(137)

这可能是一个非常简单的问题,但我无法解决它。我尝试使用this question通过jq的--stream选项提取一些数据。下面是我的json示例:

{
  "date": "2023-07-30",
  "results":[
    {
      "data": [    
        {"row": [{"key1": "row1", "key2": "row1"}]},
        {"row": [{"key1": "row2", "key2": "row2"}]}
      ]
    },
    {
      "data": [    
        {"row": [{"key1": "row3", "key2": "row3"}]},
        {"row": [{"key1": "row4", "key2": "row4"}]}
      ]
    }
  ]
}

字符串
如果没有stream,我可以使用下面的代码来提取我想要的内容:

jq -rc ".results[]" my_json.json


这会给予我想要的结果:

{"data":[{"row":[{"key1":"row1","key2":"row1"}]},{"row":[{"key1":"row2","key2":"row2"}]}]}
{"data":[{"row":[{"key1":"row3","key2":"row3"}]},{"row":[{"key1":"row4","key2":"row4"}]}]}


这个输出是每行一个json对象,正是我想要的。
但是,如果我想使用stream选项做同样的事情,我就无法得到相同的输出。

jq -rc --stream 'fromstream(1|truncate_stream(inputs | select(.[0][0] == "results")))' my_json.json


其给出:

[
  {"data":[{"row":[{"key1":"row1","key2":"row1"}]},{"row":[{"key1":"row2","key2":"row2"}]}]},
  {"data":[{"row":[{"key1":"row3","key2":"row3"}]},{"row":[{"key1":"row4","key2":"row4"}]}]}
]


我觉得我错过了一个简单的步骤来得到我需要的答案。

vfh0ocws

vfh0ocws1#

您需要通过两个级别truncate_stream.results.[]。使用inputs(和-n标志)作为输入,使用fromstream构造输出:

jq --stream -cn 'fromstream(2|truncate_stream(inputs))'

字符串
如果要显式指定.results(如果输入包含的字段不止这一个,则必须指定),请在输入上使用select

jq --stream -cn 'fromstream(2|truncate_stream(inputs | select(.[0][0] == "results")))'


输出量:

{"data":[{"row":[{"key1":"row1","key2":"row1"}]},{"row":[{"key1":"row2","key2":"row2"}]}]}
{"data":[{"row":[{"key1":"row3","key2":"row3"}]},{"row":[{"key1":"row4","key2":"row4"}]}]}

相关问题