在 中jq
,我想根据第二个数组的值在第一个数组中复制元素 n 次。如下面的示例所示,我希望第一个数组的第一个元素出现两次,数组的第二个元素出现三次。每种情况下元素的数量都不同。
["1/optimized/17853791_fpx.tif", "3/optimized/17853793_fpx.tif"]
["2", "3"]
所需的输出应如下所示:
["1/optimized/17853791_fpx.tif", "1/optimized/17853791_fpx.tif", "3/optimized/17853793_fpx.tif", "3/optimized/17853793_fpx.tif", "3/optimized/17853793_fpx.tif"]
我尝试了一些事情,但不知道该怎么做。
答案1
假设可以jq
使用以下选项将输入作为 JSON 片段传递--argjson
:
jq -n \
--argjson reps '["2","3"]' \
--argjson strs '["1/optimized/17853791_fpx.tif", "3/optimized/17853793_fpx.tif"]' \
'[ $reps | keys[] as $i | [range($reps[$i]|tonumber)] | map($strs[$i]) ] | flatten'
输出:
[
"1/optimized/17853791_fpx.tif",
"1/optimized/17853791_fpx.tif",
"3/optimized/17853793_fpx.tif",
"3/optimized/17853793_fpx.tif",
"3/optimized/17853793_fpx.tif"
]
该代码假设两个数组$reps
和$strs
具有相同的长度,并用于$reps
设置一个循环,其中循环变量$i
迭代数组的索引。
声明
[range($reps[$i]|tonumber)] | map($strs[$i])
...创建一个与$i
:th 中的数字一样长的数组$reps
,然后将该数组中的每个条目替换为 中的相应字符串$strs
。这有效地重复了$i
:th 字符串的次数与:th 中的数字的$strs
次数一样多。$i
$reps
该$i
循环发生在数组构造 ( [ ...here... ] | flatten
) 内,并且将使用问题中的数据创建一个包含以下内容的单个数组:二字符串的子数组。过滤flatten
器将这些数组“展平”为单个字符串数组,这就是我们的最终产品。
对于紧凑输出,请jq
与其-c
选项一起使用。
如果包含重复的数组包含数字而不是字符串,即类似[2,3]
other of 的东西["2","3"]
,那么您可以tonumber
从表达式中删除转换过滤器。