에서는 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