2016-08-18 52 views
2

使用JQ的JSON我有以下的JSON改變在bash

{ 
    "name" : "qwerty", 
    "values" :[ 
    { 
     "field1" : [ 
      "val1" 
      ], 
     "field2" : [ 
      "val2" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : [ 
      "val3" 
      ], 
     "field2" : [ 
      "val4" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : [ 
      "val5" 
      ], 
     "field2" : [ 
      "val6" 
      ], 
     "name1" : [["a", "b"], ["c", "d"]] 
    } 
    ] 
} 

我需要上述JSON更改爲以下使用JQ在bash

{ 
    "name" : "qwerty", 
    "values" :[ 
    { 
     "field1" : "val1", 
     "field2" : "val2", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : "val3", 
     "field2" : "val4", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    }, 
    { 
     "field1" : "val5", 
     "field2" : "val6", 
     "new_name" : [["a", "b"], ["c", "d"]] 
    } 
    ] 

} 

我在這裏面臨着以下問題:

我試着用標籤值解析內部json,並用空格替換'['']',但是,當我嘗試將「值」放入列表形式的變量中時,jq是美化和然後顯示每個作爲數組元素的新行。

values數組中的內部jsons的數量不固定。

有人可以幫助我構建jq語句在bash中運行以進行必要的更改。

+1

指出了這一點@fedorqui日Thnx,糾正問題 – vamsi

+0

你知道,這是專門'.values []。field1'和'.values []。field2'要更改,或者是任何應該摺疊爲單個值的單例列表? – chepner

+0

是「field1,field2,name」在每個json中都是固定的。但是jsons的數量並不固定。 – vamsi

回答

1

這應該工作;我不知道如果有重構分配到field1field2方式:

jq '.values[] |= (.field1=.field1[0] | .field2=.field2[0])' tmp1.json 
+0

另一種選擇是使用新值創建對象併合並它。但我認爲這比作業更醜陋,可能更具破壞性。 –

+0

僅僅基於這個名字,我認爲'foreach'可能是相關的,但我似乎無法圍繞它如何工作。我只能用'jq'.values [] |(foreach [「field1」,「field2」]作爲$ f(empty;。[$ f] =。[$ f] [ 0];空))至少符合的'tmp1.json';它不產生輸出。 – chepner

+0

在我的腦海中,我看到它的方式是'foreach'就像'減少',但有一個額外的提取部分。因此,在您的評論中的示例中,您使用空值初始化,並嘗試爲其分配值。但是空是空的,所以它在每次迭代中都不會產生結果。然後對於提取部分,您將提取爲空,所以沒有任何東西來自它。通過這種方法,您可以堅持使用'reduce'(稍作調整):'.values [] | = reduce(「field1」,「field2」)爲$ f(。;。[$ f] =。[ $ f] [0])' –

2

下面的代碼片段應該做你想要什麼:

jq '{ 
    "name": .name, 
    "values": [ 
     { 
      "field1" : .values[0].field1[0], 
      "field2" : .values[0].field2[0], 
      "New_name": .values[0].name1 
     }, 
     { 
      "field1" : .values[1].field1[0], 
      "field2" : .values[1].field2[0], 
      "new_name" : .values[1].name1 
     }, 
     { 
      "field1" : .values[2].field1[0], 
      "field2" : .values[2].field2[0], 
      "new_name" : .values[2].name1 
     } 
    ] 
}' < /tmp/input.json 

編輯

由於對象的數量不固定下面的代碼片段會做:

jq '{ 
     "name" : .name, 
     "values" : [ 
       .values[] as $in | 
       { 
         "field1" : $in.field1[0], 
         "field2" : $in.field2[0], 
         "new_name" : $in.name1 
       } 
     ] 

}' < /tmp/input.json 
+0

thnx快速響應。但是,values數組中的內部jsons的數量並不固定。 – vamsi

0

這裏是另一種解決方案。

.values |= map({ 
    field1: .field1[0], 
    field2: .field2[0], 
    new_name: .name1 
    })