
オブジェクトを含むファイルがあります。オブジェクトはaで始まり、{
で終わります}
。{ }
一部のアイテム(チェーンなど)には追加の内部ブラケットがありますが、インデントされています。私のファイルが大きすぎてjson
ファイルを解析できません。オブジェクトを複数のファイルに分割したい。私は各ファイルに完全なオブジェクトを持ちたいです。 (2つのファイル間で単一のオブジェクトを分割することはできません。これが発生すると、ファイルを解析できません。
この目標を達成する方法は?通常、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
...各オブジェクトを「圧縮」形式(1行あたり1つのオブジェクト)に変換します。
これはsplit
、個々のオブジェクトを分割することなくデータに適用できます。
次の例では、質問の正しいデータを使用して、オブジェクトごとに1split
つのファイルに分割します。
$ 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}