这是一个.json文件,我需要在中查找信息
"title":
"Spring bank holiday","date":"2012-06-04","notes":"Substitute day","bunting":true},
{"title":"Queenu2019s Diamond Jubilee","date":"2012-06-05","notes":"Extra bank holiday","bunting":true},
{"title":"Summer bank holiday","date":"2012-08-27","notes":"","bunting":true},
{"title":"Christmas Day","date":"2012-12-25","notes":"","bunting":true},
{"title":"Boxing Day","date":"2012-12-26","notes":"","bunting":true},
{"title":"New Yearu2019s Day","date":"2013-01-01","notes":"","bunting":true},
{"title":"Good Friday","date":"2013-03-29","notes":"","bunting":false},
{"title":"
文件要长得多,但它是一行很长的文本。
我想展示某个日期后的银行假日,以及是否涉及彩旗。我试过grep和sed,但我想不通。我想要这样的东西:
[command] between [date] and [}] display [title] and [bunting]/[no bunting]
[title]
应该只是"圣诞节"或其他
忘记提及:我想在bashshell中实现这一点,无论是从提示还是从一小段代码中。
您应该在一种体面的编程语言中使用一个合适的JSON解析器,这样您就可以在不需要太多代码的情况下以安全的方式完成大量工作。这个小Python代码怎么样:
#!/usr/bin/env python
import json
with open('my.json') as jsonFile:
holidays = json.load(jsonFile)
for holiday in holidays:
if holiday['date'] > '2012-05-06':
print holiday['date'], ':', holiday['title'],
("bunting" if holiday['bunting'] else "no bunting")
break # in case you only want one line of output
我想不出确切的产出应该是什么;如果你能更具体一点,我可以调整我的例子。
您可以使用awk:进行尝试
awk -F"}," '{for(i=1;i<=NF;i++){print $i}}' file.json | awk -F""[:,]"?" '$4>"2013-01-01"{printf "%s:%s:%sn" ,$2,$4,$8}'
由于json文件是一个长字符串,我们首先在}、上将这一行拆分为多个json记录。然后,每个单独的记录被拆分为":,字符的组合,并带有可选的结束符">。然后,我们只在某个日期之后输出该行。
这将找到2013年1月1日之后的所有记录。
编辑:
第二个awk使用一个子字符串将每个单独的json记录拆分为键值对,该子字符串以">开头,然后是:或,,以及可选的">结尾。因此,在您的示例中,它将在"、">、":">或":上拆分。
所有奇数字段都是键,所有偶数字段都是值(因此在您的示例中$4是日期)。然后我们检查$4(日期)是否在2013-01-01之后。
我注意到我在拆分中的可选">(后面应该是?而不是*)上犯了一个错误,我现在已经纠正了这个错误,我还使用了printf函数来显示值。