我想从大型JSON文件中提取内容,这些文件在编辑器中显示为一行(因此我无法按行进行操作),例如。
{"license": 2, "file_name": "COCO_test2014_000000523573.jpg", "coco_url": "http://mscoco.org/images/523573", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523573}, {"license . . .
例如,有没有办法(sed,grep,...?)我可以搜索单词000000523573
并打印前面的100个字符,并且在单词出现后会有200个字符?
答案 0 :(得分:2)
jq
是您要用于本机解析JSON的工具。如果它是结构化格式,请不要将其视为随机文本。
$ jq . < input.json
{
"license": 2,
"file_name": "COCO_test2014_000000523573.jpg",
"coco_url": "http://mscoco.org/images/523573",
"height": 500,
"width": 423,
"date_captured": "2013-11-14 12:21:59",
"id": 523573
}
$ jq .height < input.json
500
要搜索包含file_name
记录中特定字符串的特定JSON记录,您可能会执行以下操作:
jq 'select(.file_name|contains("000000523573"))' < input.json
这里的符号......解释时间比单个SO答案更有意义。如果您对使用此工具感兴趣,请查看JQ查询结构。
答案 1 :(得分:0)
<强> data.txt中:强>
{"license": 2, "file_name": "COCO_test2014_000000523573.jpg", "coco_url": "http://mscoco.org/images/523573", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523573}, {"license": 2, "file_name": "COCO_test2014_000000523574.jpg", "coco_url": "http://mscoco.org/images/523574", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523574}
<强>命令:强>
cat data.txt | sed 's/\},\s{/}\n{/g' | grep "000000523573"
<强>输出:强>
{"license": 2, "file_name": "COCO_test2014_000000523573.jpg", "coco_url": "http://mscoco.org/images/523573", "height": 500, "width": 423, "date_captured": "2013-11-14 12:21:59", "id": 523573}
答案 2 :(得分:0)
正如ghoti's answer所示,jq绝对是你最好的选择。
至于您的确切问题(&#34;搜索单词000000523573
并打印前面的100个字符和后面的200个字符&#34;):您可以使用grep -o
,如下所示:
grep -Eo '.{100}000000523573.{200}' infile
这有一些缺点:
000000523573
早于文件开头的100个字符或者晚于200个字符,则会被忽略。grep -o
不考虑重叠出现次数。)通过在发生之前/之后将要求放宽到&#34;打印最多 ,可以有所缓解
grep -Eo '.{,100}000000523573.{,200}' infile
但是,再一次,正确的方法是使用jq。另请参阅this question about command line JSON parsing。