使用jq对JSON进行重新整形,将每个对象扩展为多行



我有一个json格式的简历数据库,我想重塑它,使每一行都对应于一个人在给定公司的工作历史:

personid,company_name,start_date,end_date

但是,运行以下jq命令

{personid:.personid, company_name: .experience[].company.name, sdate: .experience[].start_date, edate: .experience[].end_date}

生成所有字段的笛卡尔乘积(3个作业x 3个字段(。例如,一个过去在3家不同公司担任过3份工作的人在运行上面的jq命令后看起来是这样的:

{"id":"abc123","companyname":"companyA","sdate":"2020-06","edate":null}
{"id":"abc123","companyname":"companyA","sdate":"2020-06","edate":null}
{"id":"abc123","companyname":"companyA","sdate":"2020-06","edate":"2017-07"}
{"id":"abc123","companyname":"companyA","sdate":"2016-10","edate":null}
{"id":"abc123","companyname":"companyA","sdate":"2016-10","edate":null}
{"id":"abc123","companyname":"companyA","sdate":"2016-10","edate":"2017-07"}
{"id":"abc123","companyname":"companyA","sdate":"2017-05","edate":null}
{"id":"abc123","companyname":"companyA","sdate":"2017-05","edate":null}
{"id":"abc123","companyname":"companyA","sdate":"2017-05","edate":"2017-07"}

CompanyB和CompanyC各有9个条目,但为了简洁起见,我截断了上面的输出。

我想我需要使用group_by((命令,但我一直没有成功。

提前谢谢。

在没有看到原始数据的情况下,我的猜测是您得到了笛卡尔乘积,因为您在对象构造中迭代了三次(.experience[](。您可能想要拉出迭代,也许将其保存在一个变量中,并引用它:

.experience[] as $experience | {
personid: .personid,
company_name: $experience.company.name,
sdate: $experience.start_date,
edate: $experience.end_date
}

根据构建的外部结构,也可以采用其他方式,即将.person字段存储在变量中:

.personid as $id | .experience[] | {
personid: $id,
company_name: .company.name,
sdate: .start_date,
edate: .end_date
}

最新更新