jqを使用して、2番目の配列の値に基づいて配列の要素をコピーします。

jqを使用して、2番目の配列の値に基づいて配列の要素をコピーします。

では、jq2番目の配列の値に基づいて最初の配列の要素をn回コピーしたいと思います。次の例に示すように、最初の配列の最初の要素が2回表示され、配列の2番目の要素が3回表示されます。要素の数はそれぞれの場合で異なります。

["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"
]

このコードは、2つの配列の長さが$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

おすすめ記事