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

관련 정보