jq를 사용하여 명령줄에 지정된 필드 검색

jq를 사용하여 명령줄에 지정된 필드 검색

이 입력이 주어지면

{
  "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후속 매개변수는 명령줄에서 마지막에 와야 합니다 .

관련 정보