簡體   English   中英

jq:從多個對象中查找唯一鍵

[英]jq: find unique keys from multiple object

我設法獲取了鍵列表,但無法將其作為傳遞給unique的列表。

https://jqplay.org/s/-YDVDeXTHb

我想獲取一個區域名稱列表,即

"asia"
"asia-east"
"asia-northeast"
"asia-south1"
"asia-southeast"
"australia"
"australia-southeast1"

我可以手動刪除“核心”,“內存”等。

唯一的jq解決方案:

.gcp_price_list
| del(.sustained_use_base,.sustained_use_tiers)
| [.[] | keys_unsorted[]]
| unique[]

(在這里使用keys_unsorted可以節省不必要的排序。)

更好

上面的解決方案有兩個主要問題:

a)它使用unique ,這涉及不必要的(可能是不希望的)排序操作; b)它包括其值不是數字的鍵,因此可能被排除在外。

以下變體解決了兩個問題。 為了方便起見,我們定義以下通用函數:

def set(s): reduce s as $x ({}; .[$x | (type[0:1] + tostring)] = $x);

def distinct(s): set(s)[];

.gcp_price_list
| del(.sustained_use_base,.sustained_use_tiers)
| distinct(.[]
           | keys_unsorted[] as $k
           | select( getpath([$k]) | type == "number")
           | $k)

這仍將包含一些無關的鍵,這些鍵當然可以輕松刪除(例如,使用數組減法)。

如果將JSON數據放入文件中,則可以執行以下操作:

cat data.json \
| jq '.gcp_price_list | del(.sustained_use_base,.sustained_use_tiers) | .[] | keys[]' \
| uniq

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM