객체 수를 기준으로 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}

관련 정보