>

입력

{"key1": ["value1", "value2"], "key2": ["value3"]}

원하는 결과

key1, value1
key1, value2
key2, value3

이를 달성하기 위해 jq 명령을 알아내는 데 어려움을 겪고 있습니다 ... 나는 to_entries 필터를 다양한 조합으로 필터링했지만 운이 없습니다.


  • 답변 # 1

    유효한 JSON으로 만들기 위해 JSON 객체 주변의 추가 괄호 쌍을 제거했습니다. 따라서 다음으로 시작하십시오 :

    {
      "key1": [ "value1", "value2" ],
      "key2": [ "value3" ]
    }
    
    

    우리는 to_entries 를 적용합니다 , 이것은 우리에게 이것을 제공합니다 :

    [
      {
        "key": "key1",
        "value": [ "value1", "value2" ]
      },
      {
        "key": "key2",
        "value": [ "value3" ]
      }
    ]
    
    

    그럼 우리 map  그 각각의 항목과 우리는 확산 ( [] ) .value  각 요소에 대해 별도의 객체를 생성하는 배열 ( map({key, value: .value[]}) ) ). 이것은 우리에게 준다 :

    [
      {
        "key": "key1",
        "value": "value1"
      },
      {
        "key": "key1",
        "value": "value2"
      },
      {
        "key": "key2",
        "value": "value3"
      }
    ]
    
    
    그런 다음 각 객체에 대해 값이있는 배열을 원합니다. 왜냐하면 @csv 입니다.  필터가 기대합니다. 그것은 map([.key, .value]) 에서와 같이 배열 객체에 매핑됩니다. 을 통해 다음과 같은 결과를 얻을 수 있습니다.

    [
      [ "key1", "value1" ],
      [ "key1", "value2" ],
      [ "key2", "value3" ]
    ]
    
    

    마침내 우리는 ( [] ) 배열의 배열 ( @csv 부터)  우리는 @csv 를 파이프  그것에. 전체 스크립트는 다음과 같습니다.

    jq -r 'to_entries | map({key, value: .value[]}) | map([.key, .value])[] | @csv' test.json
    
    

    그리고 그 결과 :

    "key1","value1"  
    "key1","value2"  
    "key2","value3"
    
    

  • 답변 # 2

    행을 구성하는 몇 단계를 건너 뛸 수 있습니다.

    $ jq -r 'to_entries[] | { key, value: .value[] } | [ .key, .value ] | @csv'
    
    
    jq 1.5에서는 새로운 combinations 를 활용할 수 있습니다.  키와 값의 조합을 생성하려면 필터를 사용하십시오.

    $ jq -r 'to_entries[] | [ [.key], .value ] | combinations | @csv'
    
    

  • 답변 # 3

    jq의 [] 를 사용하는 간단한 해결책은 다음과 같습니다.  연산자와 \()  문자열 보간. jq -r 와 함께 사용  최종 출력에서 ​​추가 따옴표를 피하기 위해 플래그.

     . as $v
    | keys[]
    | "\(.), \($v[.][])"
    
    

  • 이전 angular - 배열의 Observable에서 각 항목을 비동기 적으로 수정하고 수정 된 Observable을 반환
  • 다음 java - bufferedimage 누수 - 대안이 있습니까?