개체가 포함된 파일이 있습니다. 객체는 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}