オブジェクト数に基づいてjsonファイルを分割する

オブジェクト数に基づいてjsonファイルを分割する

オブジェクトを含むファイルがあります。オブジェクトは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}

関連情報