[英]How to break a JSON file into a smaller json wrapped in an array using jq?
[{"foo": 1},
{"foo": 2},
{"foo": 3},
{"foo": 4},
{"foo": 5},
{"foo": 6},
{"foo": 7},
{"foo": 8},
{"foo": 9},
{"foo": 10},
{"foo": 11},
{"foo": 12},
{"foo": 13},
{"foo": 14},
{"foo": 15}
]
我想使用jq将这个数组分解成更小的数组文件。
到目前为止,我已经尝试过了
cat foo.json | jq -c -M -s '.[]' | split -l 5 - charded/
这将产生3个单独的文件,但不会将字典包装到数组中。
jq IO相当原始,所以我建议从以下内容开始:
def chunks(n):
def c: .[0:n], (if length > n then .[n:]|c else empty end);
c;
chunks(5)
现在的关键是使用-c命令行选项:
jq -c -f chunk.jq foo.json
对于您的数据,这将产生三个数组的流,每行一个。
您可以将其传送到split
或awk
或其他内容,以将每一行发送到单独的文件,例如
awk '{n++; print > "out" n ".json"}'
如果要在每个文件中漂亮地打印数组,则可以在每个文件上使用jq,也许是用海绵 ,其方式如下:
for f in out*.json ; do jq . $f | sponge $f ; done
如果您不想定义一个函数,或者不想为管道的jq组件选择单线,请考虑以下事项:
jq -c --argjson n 5 'recurse(.[$n:]; length > 0) | .[0:$n]' foo.json
chunks
也可以在字符串上工作。 chunks
定义了0参量函数c
,以利用jq对尾部调用优化的支持。 如果data.json非常大(例如,太大而无法舒适地放入RAM中),并且如果jq版本包含所谓的流解析器,则可以先使用jq将data.json拆分为它的顶层组件元素,然后将它们重新组合,最后使用awk
或split
或本页其他位置所述的任何内容。
首先是您要使用的管道:
jq -cn --stream 'fromstream(1|truncate_stream(inputs))' data.json |
jq -cn -f groups.jq
# Use nan as EOS
def groups(stream; n):
foreach (stream,nan) as $x ([];
if length < n then . + [$x] else [$x] end;
if (.[-1]|isnan) and length > 1 then .[:-1]
elif length == n then .
else empty end) ;
groups(inputs; 5)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.