如何使用JQ按相同索引打印两个数组的对应值?
用jq实现关联数组元素的逐行配对输出
问题描述
有两个通过索引关联的数组timestamps和values,同一索引位置的元素一一对应(如timestamps[0]对应values[0]),示例输入JSON如下:
{"timestamps": ["1730135460000", "1730137620000"], "values" : ["15", "23"]}
需要输出的格式为每一行对应一对元素:
1730135460000 15 1730137620000 23
当前执行的错误命令是:
echo '{"timestamps": ["1730135460000", "1730137620000"], "values" : ["1", "2"]}' | jq -r '[ .timestamps[], .values[] ] | @tsv'
得到的错误输出是把所有元素排成了一行:
1730135460000 1730137620000 15 23
解决方案
方法1:使用transpose转置数组
transpose可将二维数组的行和列互换,正好能把两个数组的对应索引元素配对:
echo '{"timestamps": ["1730135460000", "1730137620000"], "values" : ["15", "23"]}' | jq -r '[.timestamps, .values] | transpose[] | @tsv'
- 步骤说明:
[.timestamps, .values]将两个数组组合成二维数组:[["t0", "t1"], ["v0", "v1"]]transpose转置后得到配对的子数组:[["t0", "v0"], ["t1", "v1"]][]展开每个子数组,@tsv将子数组元素用制表符分隔输出
方法2:按索引遍历配对
通过range生成索引序列,逐个取出对应位置的元素拼接输出:
echo '{"timestamps": ["1730135460000", "1730137620000"], "values" : ["15", "23"]}' | jq -r 'range(0; .timestamps | length) as $i | "\(.timestamps[$i]) \(.values[$i])"'
- 步骤说明:
range(0; .timestamps | length)生成从0到数组长度-1的索引- 遍历每个索引
$i,取出对应位置的两个元素,用空格拼接成字符串输出
两种方法都能得到预期的输出格式。
内容的提问来源于stack exchange,提问作者bajistaman
相关产品推荐
相关产品推荐

