我以这种格式从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"
}]
我想将其拆分为单独的文件:
{“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 \ n日期:星期三,2018年2月14日12:57:06 GMT \ r \ n服务器:\ r \ n \ n \ nConnection :close \ r \ n-CorrelationID:Id-2232845a8556cd3219e46ab8 0 \ r \ nContent-Type:text / xml \ r \ n \ r \ n“}
我想使用jq,但没有找到方法。
你能告诉方法,如何通过文件分隔符拆分它?
谢谢,雷迪
使用jq,可以使用过滤器将数组拆分为其组件:
.[]
那么问题就变成了每个组件要做的事情。如果要将每个组件定向到单独的文件,您可以(例如)将jq与-c选项一起使用,并将结果过滤为awk,然后awk可以将组件分配给不同的文件。参见例如Split JSON File Objects Into Multiple Files
有人可能认为调用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
如果你有一个包含2个对象的数组:
jq '.[0]' input.json > doc1.json && jq '.[1]' input.json > doc2.json
结果:
$ head -n100 doc[12].json
==> doc1.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"
}
==> doc2.json <==
{
"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"
}
您可以使用Python更有效地执行此操作(因为您可以读取整个输入一次,而不是每个文档读取一次):
import json
docs = json.load(open('in.json'))
for ii, doc in enumerate(docs):
with open('doc{}.json'.format(ii), 'w') as out:
json.dump(doc, out, indent=2)
要将具有许多记录的json拆分成所需大小的块,我只需使用:
jq -c '.[0:1000]' mybig.json
它像python切片一样工作。
请参阅此处的文档:https://stedolan.github.io/jq/manual/
数组/字符串切片:。[10:15]
。[10:15]语法可用于返回字符串的子数组或字符串的子字符串。由。[10:15]返回的数组的长度为5,包含索引10(包括)到索引15(不包括)的元素。索引可以是负数(在这种情况下,它从数组的末尾向后计数),或者省略(在这种情况下,它指的是数组的开头或结尾)。