繁体   English   中英

如何使用jq将JSON文件分解为包裹在数组中的较小json?

[英]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

对于您的数据,这将产生三个数组的流,每行一个。

您可以将其传送到splitawk或其他内容,以将每一行发送到单独的文件,例如

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

笔记

  1. chunks也可以在字符串上工作。
  2. chunks定义了0参量函数c ,以利用jq对尾部调用优化的支持。

如果data.json非常大(例如,太大而无法舒适地放入RAM中),并且如果jq版本包含所谓的流解析器,则可以先使用jq将data.json拆分为它的顶层组件元素,然后将它们重新组合,最后使用awksplit或本页其他位置所述的任何内容。

调用

首先是您要使用的管道:

jq -cn --stream 'fromstream(1|truncate_stream(inputs))' data.json |
  jq -cn -f groups.jq

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM