我正在与jq
合作开发一个Yelp json语料库,拼命想要完成一些加入&过滤任务。
business.json 包含类别和 business_id ,我可以从中获取所有餐馆ID,我想用它来过滤 review.json 提取餐馆的所有评论。
在RDBMS中听起来很直接,但我想学习jq
方式。
有人可以帮忙吗?
我尝试过的事情。
提取的商家ID并保存在id.txt中。但是不可能在jq
中引用id.txt。
在脚本循环中显示所有ID并执行jq --arg id $line '. | select( .business_id | contains($id))' reviews.json
加入两个json文件可能是可能的,但我不愿意这样做,因为文件的大小(~1G)
根据评论编辑:
简化的样本输入: business.json
{
“business_id”:“vcNAWiLM4dR7D2nwwJ7nCA”,
“full_address”:“4840 E Indian School Rd \ nSte 101 \ nPhoenix,AZ 85018”,> >
“类别”:[“餐厅”]
}
reviews.json
{
“date”:“2012-05-15”,
“文字”:“上周收到了一封信,称戈德堡博士将于6月前往亚利桑那州担任新职位。他将非常想念。\ n \ n我想找一位新医生在纽约,你真正喜欢的可能几乎和试图找到约会一样糟糕!“,
“type”:“review”,
“business_id”:“vcNAWiLM4dR7D2nwwJ7nCA” }
最佳尝试: 能够使用多个ID来运行文档,例如
jq '. | select( .business_id | contains("LRKJF43s9-3jG9Lgx4zODg", "uGykseHzyS5xAMWoN6YUqA"))' reviews.json
但无法用变量替换查询字符串,
jq --arg t vcNAWiLM4dR7D2nwwJ7nCA '. | select( .business_id | contains(env.t))' reviews.json
不起作用
答案 0 :(得分:2)
我从您的描述中不清楚每个业务和每个审核是否是顶级对象。但是,您似乎可以安排将业务和评论都显示为流,因此在下文中,我将假设:
CHAR(6)/VARCHAR(6)
(相反,如果只将业务读入内存是可以接受的,可以很容易地修改以下内容。)
逻辑是:阅读所有评论,然后为每家餐馆提取该餐厅的评论。
(a) both reviews.json and businesses.json are files of JSON objects;
(b) it is acceptable to read all the reviews into memory.
调用:
select(.categories | index("Restaurant"))
| .business_id as $business_id
| $reviews[]
| select( .type == "review" and .business_id == $business_id)
请注意,-slurpfile选项在jq 1.4中不可用。
(如果reviews.json已经是JSON对象的数组,那么你可以使用--argfile review reviews.json,因此不需要jq 1.5。)