일부 반복 텍스트가 텍스트 파일에서 누락되었는지 확인하는 방법은 무엇입니까?

일부 반복 텍스트가 텍스트 파일에서 누락되었는지 확인하는 방법은 무엇입니까?

다음과 같은 텍스트 파일이 있습니다.

{
     "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()즉, 제거하는 경우 .[]배열에서 객체를 추출하는 데에만 사용됩니다.

관련 정보