JSON: 값이 패턴과 일치하는 키 및 값 쌍을 추출하고 인쇄합니다.

JSON: 값이 패턴과 일치하는 키 및 값 쌍을 추출하고 인쇄합니다.

JSON:

"{
  "a": "https://is2-ssl.com/",
  "b": "https://a5.-ssl.com/",
  "type": "response",
  "c": [
    {
      "Number": 1,
      "Reportname": "XXX",
      "size": "2.5",
      "Variants": [
        "YYY"
      ]
    }
  ],
"Meta": "ABC"
}

원하는 출력:

XXX,a,https://is2-ssl.com/
XXX,b,https://a5.-ssl.com/

값에 "http"(url)가 포함된 키 값 쌍을 인쇄하고 키와 값을 구분 기호 ","로 병합하고 ReportName을 추가하고 싶습니다.

답변1

"JSON 문서의 첫 번째 문자의 철자가 틀려서 다음 .ReportName을 얻고 싶다고 가정해 보겠습니다.첫 번째항목을 배열로 만들고 c출력을 CSV로 만들고 싶습니다.

$ jq -r '.c[0].Reportname as $n | map_values(select(type == "string" and startswith("http"))) | to_entries[] | [$n, .key, .value] | @csv' file
"XXX","a","https://is2-ssl.com/"
"XXX","b","https://a5.-ssl.com/"

표현방식 jq:

.c[0].Reportname as $n |
map_values(select(type == "string" and startswith("http"))) |
to_entries[] | [$n, .key, .value] | @csv

먼저 값을 골라 .Reportname내부 jq변수 에 할당합니다 $n. 그런 다음 substring 으로 시작하는 문자열과 연결되지 않은 키를 삭제하여 원본 객체를 다시 작성합니다 http.

예제 문서는 map_values()다음과 같이 축소됩니다.

{
  "a": "https://is2-ssl.com/",
  "b": "https://a5.-ssl.com/"
}

그런 다음 이를 to_entries동등한 것으로 변환합니다.

[
   { "key": "a", "value": "https://is2-ssl.com/" },
   { "key": "b", "value": "https://a5.-ssl.com/" }
]

...키에 직접 액세스하세요.

배열은 개체 집합으로 확장되고, []저장된 값은 집합에 있는 각 개체의 일부와 함께 인용된 $nCSV 출력으로 변환되는 배열을 만드는 데 사용됩니다..key.value@csv


jq동일한 출력을 갖는 또 다른 표현식이지만 이전에 실행된 to_entries다음 위와 같이 객체의 값 map()대신 생성된 배열에 대해 작업을 수행합니다 .map_values()

.c[0].Reportname as $n | 
to_entries | 
map(
   select(.value | type == "string" and startswith("http")) |
   [$n, .key, .value] | @csv
)[]

관련 정보