いくつかの繰り返しテキストがテキストファイルから欠落しているかどうかを確認するには?

いくつかの繰り返しテキストがテキストファイルから欠落しているかどうかを確認するには?

次のテキストファイルがあります。

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

上記のブロックで3番目の項目を見るとわかります。「データソース名」: ....すべて書いた。非常に大きなファイルがあり、この特定のファイルが欠落していることを確認し、そうであれば印刷/エコーしたいと思います。

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()つまり、削除する場合は、.[]配列からオブジェクトを抽出するためにのみ使用されます。

関連情報