Json jq'中的Zip列表;s对象构造为{},而不是像默认值那样将它们相乘

Json jq'中的Zip列表;s对象构造为{},而不是像默认值那样将它们相乘,json,jq,transpose,Json,Jq,Transpose,类似于以下内容的JSON对象: {"user":"stedolan","titles":["JQ Primer", "More JQ"],"years":[2013, 2016]} {"user":"stedolan","title":"JQ Primer","year":20

类似于以下内容的JSON对象:

{"user":"stedolan","titles":["JQ Primer", "More JQ"],"years":[2013, 2016]}
{"user":"stedolan","title":"JQ Primer","year":2013}
{"user":"stedolan","title":"More JQ","year":2016}
并且,我想将其转换为列表(假设所有列表都具有相同长度
N
)压缩并输出如下:

{"user":"stedolan","titles":["JQ Primer", "More JQ"],"years":[2013, 2016]}
{"user":"stedolan","title":"JQ Primer","year":2013}
{"user":"stedolan","title":"More JQ","year":2016}
我遵循
Object-{}
示例并尝试:

tmp='{“用户”:“stedolan”,“标题”:[“JQ入门”,“更多JQ”],“年份”:[2013、2016]}'
echo$tmp | jq'{用户,标题:。标题[],年份:。年份[]}
然后输出:

{"user":"stedolan","title":"JQ Primer","year":2013}
{"user":"stedolan","title":"JQ Primer","year":2016}
{"user":"stedolan","title":"More JQ","year":2013}
{"user":"stedolan","title":"More JQ","year":2016}
它生成
N*N…
行结果,而不是
N
行结果


任何建议都将不胜感激

如果希望输出的键按Q中指示的顺序排列,那么解决方案比其他情况要复杂一些

以下是保留订单的一种方法:

with_entries( .key |= (if . == "titles" then "title" elif . == "years" then "year" else . end) )
| range(0; .title|length) as $i
| .title |= .[$i]
| .year |= .[$i]

这种方法的(潜在)优点是不必提及任何其他键。

transpose/0
可用于有效地将值压缩在一起。赋值工作方式的好处在于,它可以在多个变量上同时赋值

([.titles,.years]|transpose[]) as [$title,$year] | {user,$title,$year}
如果您希望结果是数组而不是流,只需将其全部包装在
[]
中即可


对于兼容JQ1.4的版本,您必须将其重写为不使用解构,但可以使用内置的相同的
transpose/0
实现

:

这里有一个我设计的替代实现,它也应该兼容。:)


谢谢!这真是一个巧妙而优雅的解决方案!顺便说一句,它与
jq1.6
一起工作,并报告错误“语法错误,
jq1.4
出现意外的“[”,预期为“$”。不幸的是,1.4不支持解构或转置。幸运的是,解构只是让它看起来更美观,并且可以解决。转置可能会从内置中拉出并使用。()
([.titles,.years]|transpose[]) as $p | {user,title:$p[0],year:$p[1]}