我有一个包含对象的文件。该对象以 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}