次のテキストファイルがあります。
{
"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()
つまり、削除する場合は、.[]
配列からオブジェクトを抽出するためにのみ使用されます。