2015-04-03 110 views
4

我的數據是一系列JSON數組。每個陣列具有帶有名稱和ID鍵的一種或多種元素:jq:只選擇一個包含元素A但不包含元素B的數組

[ 
    { 
    "name": "first_source", 
    "id": "abcdef" 
    }, 
    { 
    "name": "second_source", 
    "id": "ghijkl" 
    }, 
    { 
    "name": "third_source", 
    "id": "opqrst" 
    } 
] 

如何,使用JQ,我僅選擇含有以「第一源」作爲名稱值的元件陣列,但其不包含「second_source」作爲任何元素的名稱值?

這隻能返回一個元素作進一步處理:

jq '.[] | select (.name == "first_source") 

但我顯然需要返回我的方案的工作對整個陣列。

回答

5

您可以使用此過濾器:

select(
    (map(.name == "first_source") | any) and 
    (map(.name != "second_source") | all) 
) 

您需要測試一個數組中的所有元素的名稱的存在。您可以通過將每個對象映射到您的條件並適當使用anyall過濾器來實現。

在這裏,您要查看是否有任何項目被命名爲"first_source",並且所有項目都未命名爲"second_source"

+1

當我嘗試,我得到'jq:錯誤(在:14):不能索引字符串與字符串「名稱」 – deitch 2017-06-15 08:05:29

相關問題