如何检查文本文件中是否缺少某些重复出现的文本?

如何检查文本文件中是否缺少某些重复出现的文本?

我有一个如下所示的文本文件:

{
     "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()表达式中的语句就可以了。即,您将删除.[],它仅用于从数组中提取对象。

相关内容