我想从大型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个字符。
发布于 2016-12-31 07:50:12
是您想要在本地解析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这里的符号是..。对于一个简单的答案来说,解释的时间比合理的要长。如果您对使用此工具感兴趣,请务必查看JQ查询结构。
发布于 2016-12-31 07:45:00
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}发布于 2017-01-01 03:39:01
正如在ghoti's answer中所展示的,jq绝对是您最好的选择。
至于您的确切问题(“搜索单词000000523573并打印前面的100个字符和后面的200个字符”):您可以按如下方式使用grep -o:
grep -Eo '.{100}000000523573.{200}' infile这有几个缺点:
000000523573出现在距文件开头的100个字符之前或晚于文件结尾的200个字符,则将忽略它。grep -o).考虑在内
通过放宽“在出现之前/之后最多打印100/200个字符”的要求,可以在一定程度上缓解这些问题:
grep -Eo '.{,100}000000523573.{,200}' infile但是,同样,正确的方法是使用jq。另请参见this question about command line JSON parsing。
https://stackoverflow.com/questions/41404009
复制相似问题