Como verificar se algum texto recorrente está faltando em um arquivo de texto?

1

Eu tenho um arquivo de texto com esta aparência:

{
     "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",
     }

Se você vir o terceiro no bloco acima, você perceberá que "data_source_name": .... está faltando. Eu tenho um arquivo que é realmente enorme e quero verificar se esta coisa em particular está faltando, e se faltando, imprima / echo.

Eu tentei sed mas não consigo descobrir como usá-lo corretamente.

É possível usar sed ou outra coisa?

    
por Koshur 08.06.2016 / 15:03

2 respostas

1

Com o GNU awk , você pode usar }, { como o separador de registro e imprimir os registros que não contêm "data_source_name": :

gawk -v RS='}\s*,\s*{' '!/"data_source_name":/'

Ou você pode decodificá-lo como o tipo de json que parece estar usando por exemplo 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
    
por 08.06.2016 / 16:11
1

Embora awk pareça mais razoável de usar neste caso, você pode usar o gnu sed como:

sed 'H;/}/{g;/data_source_name/!p;z;h};d'

descrição:

    #!/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
    
por 08.06.2016 / 17:30