为了账号安全,请及时绑定邮箱和手机立即绑定

使用Unix工具解析JSON

使用Unix工具解析JSON

慕工程0101907 2019-05-27 11:17:33
使用Unix工具解析JSON我正在尝试解析从curl请求返回的JSON,如下所示:curl 'http://twitter.com/users/username.json' |    sed -e 's/[{}]/''/g' |     awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'以上将JSON拆分为字段,例如:% ..."geo_enabled":false"friends_count":245"profile_text_color":"000000""status":"in_reply_to_screen_name":null"source":"web""truncated":false"text":"My status""favorited":false% ...如何打印特定字段(用-v k=text?表示)?
查看完整描述

4 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

要快速提取特定键的值,我个人喜欢使用“grep -o”,它只返回正则表达式的匹配。例如,要从推文中获取“文本”字段,请执行以下操作:

grep -Po '"text":.*?[^\\]",' tweets.json

这个正则表达式比你想象的更强大; 例如,它可以很好地处理嵌入了逗号并在其中包含转义引号的字符串。我认为通过更多的工作,你可以制作一个实际上可以保证提取值,如果它是原子的。(如果它有嵌套,那么正则表达式当然不能这样做。)

为了进一步清洁(虽然保持弦的原始逃逸),你可以使用类似的东西:| perl -pe 's/"text"://; s/^"//; s/",$//'。(我为此分析做了这个。)

对于所有坚持你的仇敌应该使用真正的JSON解析器 - 是的,这对正确性至关重要,但是

  1. 要做一个非常快速的分析,比如计算值以检查数据清理错误或获得对数据的一般感觉,在命令行上敲打一些东西会更快。打开编辑器编写脚本会分散注意力。

  2. grep -o比Python标准json库快几个数量级,至少在为推文(每个约2 KB)执行此操作时。我不确定这是不是因为json速度慢(我应该在某个时候与yajl比较); 但原则上,正则表达式应该更快,因为它是有限状态并且更加可优化,而不是必须支持递归的解析器,并且在这种情况下,为您不关心的结构花费大量CPU构建树。(如果有人写了一个有限状态传感器,它做了适当的(深度限制的)JSON解析,那就太棒了!同时我们有“grep -o”。)

要编写可维护的代码,我总是使用真正的解析库。我没有尝试过jsawk,但是如果它运行良好,那将解决点#1。

最后一个更糟糕的解决方案:我编写了一个脚本,它使用Python json并将所需的键提取到以制表符分隔的列中; 然后我通过一个包装器管道awk,允许对列进行命名访问。 在这里:json2tsv和tsvawk脚本。所以对于这个例子,它将是:

json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'

这种方法没有解决#2问题,比单个Python脚本效率更低,而且有点脆弱:它强制对字符串值中的换行符和制表符进行规范化,以便与awk的字段/记录分隔的世界视图一起使用。但它确实让你留在命令行,更正确grep -o


查看完整回答
反对 回复 2019-05-27
  • 4 回答
  • 0 关注
  • 782 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信