一尘不染

使用jq如何将一个非常大的JSON文件拆分为多个文件,每个文件都有特定数量的对象?

json

我有一个很大的JSON文件,我猜测有400万个对象。每个顶层都有嵌套的几个层次。我想将其拆分为每个10000个顶级对象的多个文件(保留每个文件的内部结构)。jq应该能够做到吗?我不确定如何。

像这样的数据:

[{
  "id": 1,
  "user": {
    "name": "Nichols Cockle",
    "email": "ncockle0@tmall.com",
    "address": {
      "city": "Turt",
      "state": "Thị Trấn Yên Phú"
    }
  },
  "product": {
    "name": "Lychee - Canned",
    "code": "36987-1526"
  }
}, {
  "id": 2,
  "user": {
    "name": "Isacco Scrancher",
    "email": "iscrancher1@aol.com",
    "address": {
      "city": "Likwatang Timur",
      "state": "Biharamulo"
    }
  },
  "product": {
    "name": "Beer - Original Organic Lager",
    "code": "47993-200"
  }
}, {
  "id": 3,
  "user": {
    "name": "Elga Sikora",
    "email": "esikora2@statcounter.com",
    "address": {
      "city": "Wenheng",
      "state": "Piedra del Águila"
    }
  },
  "product": {
    "name": "Parsley - Dried",
    "code": "36987-1632"
  }
}, {
  "id": 4,
  "user": {
    "name": "Andria Keatch",
    "email": "akeatch3@salon.com",
    "address": {
      "city": "Arras",
      "state": "Iracemápolis"
    }
  },
  "product": {
    "name": "Wine - Segura Viudas Aria Brut",
    "code": "51079-385"
  }
}, {
  "id": 5,
  "user": {
    "name": "Dara Sprowle",
    "email": "dsprowle4@slate.com",
    "address": {
      "city": "Huatai",
      "state": "Kaduna"
    }
  },
  "product": {
    "name": "Pork - Hock And Feet Attached",
    "code": "0054-8648"
  }
}]

这是一个完整的对象:

{
  "id": 1,
  "user": {
    "name": "Nichols Cockle",
    "email": "ncockle0@tmall.com",
    "address": {
      "city": "Turt",
      "state": "Thị Trấn Yên Phú"
    }
  },
  "product": {
    "name": "Lychee - Canned",
    "code": "36987-1526"
  }
}

每个文件都是指定数量的对象。


阅读 452

收藏
2020-07-27

共1个答案

一尘不染

[编辑:此答案已根据对该问题的修订进行了修订。]

使用jq解决问题的关键是-c命令行选项,该选项以JSON-
Lines格式(即,在当前情况下,每行一个对象)生成输出。然后,您可以使用诸如awk或的工具split,将这些行分配到多个文件中。

如果文件不是太大,那么最简单的方法是使用以下方法启动管道:

jq -c '.[]' INPUTFILE

如果文件太大而无法容纳在内存中,则可以使用jq的流解析器,如下所示:

jq -cn --stream 'fromstream(1|truncate_stream(inputs))'

有关流解析器的更多讨论,请参见例如jq
FAQ中的相关部分:https : //github.com/stedolan/jq/wiki/FAQ#streaming-json-
parser

分区

如果要求每个输出文件都是对象数组,那么我可能会用awk一步来执行分区和重构,但是还有许多其他合理的方法。

如果输入是JSON对象序列

作为参考,如果原始文件由JSON对象的流或序列组成,则适当的调用将是:

jq -n -c inputs INPUTFILE

inputs以这种方式使用允许任意有效地处理许多对象。

2020-07-27