2017-01-27 2 views
0

두 개의 json 파일이 있고, 하나는 맵 키 이름과 유형을 포함하고, 다른 하나는 플랫 json 파일입니다.jq를 사용하여 하나의 json 파일에있는 값을 다른 사전 json 파일에서 바꿀 수 있습니까?

예 :

{ "col1":{ "int" : 123 }, "col2": { "string" : "foo"} } 
{ "col1":{ "int" : 123 }, "col2": { "string" : "foo"} } 

.... 
:

{ "col1":123, "col2": "foo"} 
{ "col1":123, "col2": "foo"} 
... 

은이 같은 출력 JSON를 생성 JQ를 사용할 수

[ { "field": "col1", "type": "int" }, { "field" : "col2", "type" : "string" }] 

초 파일 큰 jsons 줄 바꿈에 의해 구분 된 파일을 목적으로한다 : 첫 번째 파일은 다음과 같이 포함

+0

체크 아웃'jq'의'--slurpfile' 옵션 : 산출

$ jq --argfile file1 file1.json ' (reduce $file1[] as $i ({}; .[$i.field] = $i.type)) as $map | with_entries(.value = { ($map[.key]): .value }) ' file2.json 

. 그것은 절반의 일을하지만, 나는 하반기를 생산하는'jq'를 가진 너무 초보자입니다. – Aaron

답변

1

확실히. 먼저 쉽게 소비하는 형식으로 첫 번째 파일을 변환 할 수 있습니다 :

reduce .[] as $i ({}; .[$i.field] = $i.type) 

그런 다음 사용할 두 번째 파일을 통해 갈 수있다 (사전으로 사용) 객체로 .field 특성에 .type지도 이 맵핑은 값을 갱신합니다. --argfile을 사용하면 첫 번째 파일의 내용을 변수로 읽을 수 있습니다. 쉽게 두 번째 파일을 소비하는

{ 
    "col1": { 
    "int": 123 
    }, 
    "col2": { 
    "string": "foo" 
    } 
} 
{ 
    "col1": { 
    "int": 123 
    }, 
    "col2": { 
    "string": "foo" 
    } 
} 
1

예. --slurpfile 옵션을 사용할 수는 있지만 사전은 이미 하나의 JSON 엔티티 (사용자의 경우 JSON 객체)이므로 --argfile 옵션을 사용하여 사전을 읽는 것이 더 쉽습니다.

가정하면 :

당신의 JQ 필터는 파일에
  • merge.jq 말;
  • 사전은 dictionary.json에 있습니다. 당신은 물론 병합에 $의 DICT로 사전에 참조합니다, 위의와

    jq -f merge.jq --argfile dict dictionary.json input.json 
    

    :

  • 사용자의 입력 스트림 input.json

JQ 호출은 다음과 같을 것입니다. JQ

(즉, 당신이 선호하는 거라면 물론 당신의 JQ 명령 행에서 필터를 지정할 수 있습니다.) 이제

, 이상 당신에게!