根据对象数量拆分 json 文件

根据对象数量拆分 json 文件

我有一个包含对象的文件。该对象以 a 开头{并以 结束}{ }有些物品(例如链条)还有其他内部支架,但它们有缩进。我的文件非常大,因此我无法解析该json文件。我想将对象分成几个文件。我想要每个文件中有一个完整的对象(我无法在两个文件之间分割单个对象。如果发生这种情况,我将无法解析该文件。

如何实现这一目标?一般split不会考虑将完整的对象保留在文件内。我可以通过“主机”来识别对象,并通过{ }行的开头来识别对象的开始和结束,而无需缩进。有没有办法根据对象的数量分割文件?

{
  "host": "a.com",
  "ip": "1.2.2.3",
  "port": 8,
  "chain": [
  {
    "version": 3,
    "subject": "xx"
  },  {
    "version": 3,
    "subject": "xx"
  } ]
}
{
  "host": "b.com",
  "ip": "2.5.0.4",
  "port": 3
  "chain": [
  {
    "version": 3,
    "subject": "xx"
  },  {
    "version": 3,
    "subject": "xx"
  } ]
}
{
  "host": "c.com",
  "ip": "9.17.6.7",
  "port": 4
}

答案1

我假设 JSON 输入文档在语法上是正确的(问题中的文档第 18 行缺少逗号)。

由于输入由一组独立的对象组成,因此您可以使用jq-c( --compact-output) 选项,

jq -c . file

...将每个对象转换为“紧凑”形式(每行一个对象)。

这样做可以split在不分割任何单个对象的情况下应用于数据。

下面的示例使用问题中的正确数据,然后将其拆分split为每个对象一个文件:

$ jq -c . file
{"host":"a.com","ip":"1.2.2.3","port":8,"chain":[{"version":3,"subject":"xx"},{"version":3,"subject":"xx"}]}
{"host":"b.com","ip":"2.5.0.4","port":3,"chain":[{"version":3,"subject":"xx"},{"version":3,"subject":"xx"}]}
{"host":"c.com","ip":"9.17.6.7","port":4}
$ jq -c . file | split -l 1
$ ls
file    xaa     xab     xac
$ cat xaa
{"host":"a.com","ip":"1.2.2.3","port":8,"chain":[{"version":3,"subject":"xx"},{"version":3,"subject":"xx"}]}
$ cat xab
{"host":"b.com","ip":"2.5.0.4","port":3,"chain":[{"version":3,"subject":"xx"},{"version":3,"subject":"xx"}]}
$ cat xac
{"host":"c.com","ip":"9.17.6.7","port":4}

相关内容