2017-02-02 2 views
2

하자가jq에서 직교 곱을 만드는 방법은 무엇입니까?

echo '[{"a": 1, "b": 2}, {"a": 3, "b": 4}]' | jq '[{x: .[].a, y: .[].b}]' 

, 내가 입력

[ 
    { 
     "a":1, 
     "b":2 
    }, 
    { 
     "a":3, 
     "b":4 
    } 
] 

을하고 난 시도 말하고 난 내가 출력을 필요로 배열의 모든 항목에 대한 필요 의미

[ 
    { 
     "x":1, 
     "b":2, 
     "language":"en" 
    }, 
    { 
     "x":1, 
     "b":2, 
     "language":"fr" 
    }... 
] 

을 좀하고 싶습니다 두 항목, 하나는 "lanuage": "en" 키 값 쌍이 있고 다른 하나는 "lanuage": "ru"

EDIT. 분명히 enoug가 아니기 때문에. 오브젝트 is의 입력 배열과 다른 배열 xs을 가진 Catesian 제품이 필요합니다. 그러면 (i, x) 쌍이 생깁니다. 각 쌍마다 x의 값을 가진 i (내 경우에는 language)의 모든 (키, 값) 쌍을 가진 개체를 출력하고 싶습니다.

답변

1

일반적으로 여러 값을 생성하는 다른 식과 결합 된 여러 값을 생성하는 식에서는 여러 값을 생성하여 데카르트 곱을 생성합니다.

"\(1,2) \(3,4)" 

문자열 "1 3", "2 3", "1 4""2 4"를 생성한다.

동일한 값 배열을 사용할 수 있습니다. []은 배열을 가져 와서 각 항목에 대한 결과를 생성합니다. 그래서 이러한 개념을 결합, 당신은 같은 것을 할 수있는 :

$ jq --argjson langs '["en","fr"]' '[(.[]|{x:.a,b}) + {language:$langs[]}]' input.json 

을하지만 더 간단히 줄일 수있다 :

$ jq --argjson langs '["en","fr"]' '[.[]|{x:.a,b,language:$langs[]}]' input.json 

또는

$ jq --argjson langs '["en","fr"]' 'map({x:.a,b,language:$langs[]})' input.json 
+0

이 작품을 almosts하지만 출력 잘못된 JSON을 배열이 필요해. 그렇게하는 방법? – user1685095

+0

글쎄, 그것은 json 객체의 스트림입니다. 스트림을 배열로 필요로하는 경우 대괄호를 추가하여 배열에 배치하면됩니다. –

+0

글쎄,이 'echo'[{ "a": 1, "b": 2}, { "a": 3, "b": 4}] '| jq -argjson langs '[ "en", "fr"]' '. [] | [{x : .a, y : .b, 언어 : $ langs []}] ''. 이것은 배열의 스트림을 만듭니다. – user1685095