이 입력이 주어지면
{
"attributes": {
"f1": "one",
"f2": "two",
"f3": "three"
}
}
jq 명령줄에서 검색하고 내보낼 필드를 지정할 수 있기를 원합니다.그들의값은 같은 줄에 공백으로 구분됩니다.
jq -r 'some-filter' --argjson fields '["f3","f1"]' test.json
결과:three one
jq -r 'some-filter' --argjson fields '["f2"]' test.json
결과:two
나는 이 필터의 여러 변형을 시도했지만 성공하지 못했습니다.
.attributes
| $fields | . as $f | "\($f)"
답변1
너할 수 있다시도한 대로 변수 기호 바인딩을 사용하여 이 작업을 수행합니다.
jq -r --argjson fields '["f3","f1"]' '[$fields[] as $f | .attributes | .[$f]] | join(" ")' test.json
아니면 좀 더 컴팩트하게
jq -r --argjson fields '["f3","f1"]' '[$fields[] as $f | .attributes[$f]] | join(" ")' test.json
하지만 적어도 jq 1.6에서는 $fields[]
반복자를 전달할 수 있는 것 같습니다.범용 개체 인덱스형태.[<string>]
jq -r --argjson fields '["f3","f1"]' '[.attributes[$fields[]]] | join(" ")' test.json
전임자.
$ jq -r --argjson fields '["f3","f1"]' '[.attributes[$fields[]]] | join(" ")' test.json
three one
$ jq -r --argjson fields '["f2"]' '[.attributes[$fields[]]] | join(" ")' test.json
two
답변2
만약 너라면진짜추출하려는 값이 포함된 키가 포함된 JSON 배열을 전달하려면 다음을 수행하세요.
jq -r --argjson keys '["f3", "f1"]' '.attributes[$keys[]]' file.json
질문의 데이터가 주어지면 이는 다음을 반환합니다.
three
one
같은 줄에 배치하고 공백 구분 기호를 사용하려면 다음을 수행하십시오.
jq -r --argjson keys '["f3", "f1"]' '[.attributes[$keys[]]] | join(" ")' file.json
또는 첫 번째 명령의 출력을 다음으로 파이프하면 됩니다 paste -d ' ' -s -
.
jq -r --argjson keys '["f3", "f1"]' '.attributes[$keys[]]' file.json |
paste -d ' ' -s -
명령 사용자가 JSON 배열을 생성하지 않고도 원하는 필드를 더 편리하게 언급할 수 있는 경우(아마도 키를 올바르게 인코딩하는 것을 기억해야 함):
jq -r '.attributes[$ARGS.positional[]]' file.json --args f3 f1
또는 공백으로 구분된 단일 행 출력 변형의 경우:
jq -r '.attributes[$ARGS.positional[]]' file.json --args f3 f1 |
paste -d ' ' -s -
--args
후속 매개변수는 명령줄에서 마지막에 와야 합니다 .