使用 jq 根据第二个数组中的值复制数组中的元素

使用 jq 根据第二个数组中的值复制数组中的元素

在 中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从表达式中删除转换过滤器。

相关内容