jq를 사용하여 json 배열에서 부분적으로 일치하는 검색어가 포함된 배열을 가져옵니다.

jq를 사용하여 json 배열에서 부분적으로 일치하는 검색어가 포함된 배열을 가져옵니다.

["a", "b", "c"], ["abc", "e", "f"]다음 json 데이터와 "a"가 부분적으로 일치하는 검색어로 주어지면 jq를 사용하여 부분적으로 일치하는 검색어 "a"가 포함된 배열을 어떻게 얻을 수 있나요?

[
    ["a", "b", "c"],
    ["abc", "e", "f"],
    ["g", "h", "i"]
]

jq '. [] | select(index("a"))'정확히 일치하는 항목만 가져오지만 ["a", "b", "c"]"abc"에 "a"가 포함되어 있기 때문에 가져오고 싶습니다.["abc", "e", "f"]

답변1

다음과 약간 다른 접근 방식노 젓는 배는 무엇을 가져갔나요?:

jq 'map(select(any(contains("a"))))' file

가장 안쪽 테스트는 각 문자열의 하위 문자열을 테스트합니다 a. 하위 배열의 문자열에 가 포함되어 있으면 a해당 하위 배열이 선택됩니다. map최상위 배열의 모든 하위 배열에 선택을 적용합니다 .

결과는 하위 문자열을 포함하는 요소가 하나 이상 포함된 하위 배열의 최상위 배열입니다 a.

[
  [
    "a",
    "b",
    "c"
  ],
  [
    "abc",
    "e",
    "f"
  ]
]

답변2

jq '[.[] | select(contains(["a"]))]'

입력 배열을 사용하십시오.

$ jq -c << \\ '[.[] | select(contains(["a"]))]'
[
    ["a", "b", "c"],
    ["abc", "e", "f"],
    ["g", "h", "i"]
]
\
[["a","b","c"],["abc","e","f"]]

man jq(https://stedolan.github.io/jq/manual/) 조금 길지만 관련 부분은 다음과 같습니다.

contains(b)b가 입력에 완전히 포함되면 필터는 true를 생성합니다. B가 A의 부분 문자열이면 문자열 B는 문자열 A에 포함됩니다. B의 모든 요소가 A의 요소에 포함된 경우 배열 B는 배열 A에 포함됩니다.

jq 'contains(["baz", "bar"])'
유형["foobar","foobaz","blarp"]
참으로 출력

관련 정보