将 JSON 数组拆分为单独的文件/对象

Red*_* SK 6 json posix jq

我以这种格式从 Cassandra 导出了 JSON。

[
  {
    "correlationId": "2232845a8556cd3219e46ab8",
    "leg": 0,
    "tag": "received",
    "offset": 263128,
    "len": 30,
    "prev": {
      "page": {
        "file": 0,
        "page": 0
      },
      "record": 0
    },
    "data": "HEAD /healthcheck HTTP/1.1\r\n\r\n"
  },
  {
    "correlationId": "2232845a8556cd3219e46ab8",
    "leg": 0,
    "tag": "sent",
    "offset": 262971,
    "len": 157,
    "prev": {
      "page": {
        "file": 10330,
        "page": 6
      },
      "record": 1271
    },
    "data": "HTTP/1.1 200 OK\r\nDate: Wed, 14 Feb 2018 12:57:06 GMT\r\nServer: \r\nConnection: close\r\nX-CorrelationID: Id-2232845a8556cd3219e46ab8 0\r\nContent-Type: text/xml\r\n\r\n"
  }]
Run Code Online (Sandbox Code Playgroud)

我想将其拆分为单独的文件:

{ "correlationId": "2232845a8556cd3219e46ab8", "leg": 0, "tag": "received", "offset": 263128, "len": 30, "prev": { "page": { "file": 0 , "page": 0 }, "record": 0 }, "data": "HEAD /healthcheck HTTP/1.1\r\n\r\n" }

{ "correlationId": "2232845a8556cd3219e46ab8", "leg": 0, "tag": "sent", "offset": 262971, "len": 157, "prev": { "page": { "file": 10330 , "page": 6 }, "record": 1271 }, "data": "HTTP/1.1 200 OK\r\nDate: Wed, 14 Feb 2018 12:57:06 GMT\r\nServer: \r\nConnection : 关闭\r\nX-CorrelationID: Id-2232845a8556cd3219e46ab8 0\r\n内容类型: text/xml\r\n\r\n" }

我想使用jq但没有找到方法。

你能指点一下,如何通过文件分隔符分割它?

谢谢,雷迪

pea*_*eak 7

使用 jq,可以使用过滤器将数组拆分为其组件:

.[]
Run Code Online (Sandbox Code Playgroud)

那么问题就变成了要对每个组件做什么。如果您想将每个组件指向一个单独的文件,您可以(例如)使用带有 -c 选项的 jq,并将结果过滤到 awk 中,然后可以将组件分配到不同的文件。参见例如将JSON 文件对象拆分为多个文件

性能注意事项

有人可能认为调用 jq+awk 的开销会比调用 python 高,但与 python+json 相比,jq 和 awk 都是轻量级的,正如这些时间所建议的(使用 Python 2.7.10):

time (jq -c  .[] input.json | awk '{print > "doc00" NR ".json";}')
user    0m0.005s
sys     0m0.008s

time python split.py
user    0m0.016s
sys     0m0.046s
Run Code Online (Sandbox Code Playgroud)


dja*_*aut 5

要将具有许多记录的 json 拆分为所需大小的块,我只需使用:

jq -c '.[0:1000]' mybig.json
Run Code Online (Sandbox Code Playgroud)

它的工作原理类似于 python 切片。

请参阅此处的文档:https : //stedolan.github.io/jq/manual/

数组/字符串切片:.[10:15]

.[10:15] 语法可用于返回数组的子数组或字符串的子字符串。.[10:15] 返回的数组长度为 5,包含从索引 10(包括)到索引 15(不包括)的元素。任何一个索引都可以是负数(在这种情况下它从数组的末尾向后计数),或者被省略(在这种情况下它指的是数组的开头或结尾)。