다음과 같은 텍스트 파일이 있습니다.
{
"mimeType": "web",
"body": "adsfdf",
"data_source_name": "abc",
"format": "web",
"url": "http://google.com/",
"urls": "http://google.com/",
"lastModified": "123123",
"title": "Google",
"docdatetime_dt": "1231234",
"wfbdomain": "google.com",
"id": "http://google.com",
},
{
"mimeType": "web",
"body": "adsfdf",
"data_source_name": "zdf",
"format": "web",
"url": "http://facebook.com/",
"urls": "http://facebook.com/",
"lastModified": "123123",
"title": "Facebook",
"docdatetime_dt": "1231234",
"wfbdomain": "facebook.com",
"id": "http://facebook.com",
},
{
"mimeType": "web",
"body": "adsfdf",
"format": "web",
"url": "http://twitter.com/",
"urls": "http://twitter.com/",
"lastModified": "123123",
"title": "Twitter",
"docdatetime_dt": "1231234",
"wfbdomain": "twitter.com",
"id": "http://twitter.com",
}
위 블록에서 세 번째 항목을 보면 알 수 있습니다."데이터 소스 이름": ....다 쓴. 매우 큰 파일이 있는데 이 특정 파일이 누락되었는지 확인하고, 그렇다면 인쇄/에코하고 싶습니다.
sed를 사용해 보았지만 올바르게 사용하는 방법을 알 수 없습니다.
sed나 다른 것을 사용할 수 있습니까?
답변1
GNU를 사용하면 레코드 구분 기호 awk
로 사용 }, {
하고 포함되지 않은 레코드를 인쇄할 수 있습니다 "data_source_name":
.
gawk -v RS='}\\s*,\\s*{' '!/"data_source_name":/'
또는 사용하는 것으로 보이는 json 유형으로 디코딩할 수 있습니다 JSON::PP
.
perl -MJSON::PP -l -0777 -ne '
$j = JSON::PP->new->relaxed->pretty;
print $j->encode($_) for grep {!defined($_->{data_source_name})}
@{$j->decode("[$_]")}' < file.json
답변2
이 경우에 사용하는 것이 더 합리적으로 보이지만 awk
다음과 같이 gnu를 사용할 수 있습니다 sed
.
sed 'H;/}/{g;/data_source_name/!p;z;h};d'
설명하다:
#!/bin/sed -f
H # append each line to hold space
/}/ { # on each closing bracket
g # get contents of hold space to pattern space
/data_source_name/!p # print pattern space if it does not contain "data_source_name"
z;h # empty hold space
}
d
답변3
입력이 JSON 객체의 유효한 배열이라고 가정하면,
$ jq '.[] | select(has("data_source_name")|not)' file
{
"mimeType": "web",
"body": "adsfdf",
"format": "web",
"url": "http://twitter.com/",
"urls": "http://twitter.com/",
"lastModified": "123123",
"title": "Twitter",
"docdatetime_dt": "1231234",
"wfbdomain": "twitter.com",
"id": "http://twitter.com"
}
이는 명령줄 파서를 사용하여 키 없이 jq
모든 개체를 출력합니다 data_source_name
.
귀하의 데이터가 JSON을 유효하지 않게 만드는 이유는(귀하의 질문에 대해 수정했다고 가정하기 때문에) 주변 콘텐츠가 누락되고 [ ... ]
각 개체의 마지막 값 끝에(각 종료 전) 후행 쉼표가 있다는 것입니다 }
.
JSON 입력이 다음과 같은 경우놓다개체(주변 개체 없음 [ ... ]
, 개체 사이에 쉼표 없음, 각 종료 앞에 후행 쉼표 없음 ), 표현식 내의 문을 }
사용하면 트릭이 수행됩니다. select()
즉, 제거하는 경우 .[]
배열에서 객체를 추출하는 데에만 사용됩니다.