使用jq加入并过滤JSON文件

时间:2015-09-07 15:58:51

标签: json jq

我正在与jq合作开发一个Yelp json语料库,拼命想要完成一些加入&过滤任务。 business.json 包含类别 business_id ,我可以从中获取所有餐馆ID,我想用它来过滤 review.json 提取餐馆的所有评论。

在RDBMS中听起来很直接,但我想学习jq方式。

有人可以帮忙吗?

我尝试过的事情。

  1. 提取的商家ID并保存在id.txt中。但是不可能在jq中引用id.txt。

  2. 在脚本循环中显示所有ID并执行jq --arg id $line '. | select( .business_id | contains($id))' reviews.json

  3. 加入两个json文件可能是可能的,但我不愿意这样做,因为文件的大小(~1G)

  4. 根据评论编辑:

    简化的样本输入: 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不起作用

1 个答案:

答案 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。)