我以这种格式从 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但没有找到方法。
你能指点一下,如何通过文件分隔符分割它?
谢谢,雷迪
使用 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)
要将具有许多记录的 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(不包括)的元素。任何一个索引都可以是负数(在这种情况下它从数组的末尾向后计数),或者被省略(在这种情况下它指的是数组的开头或结尾)。