jq:从多个对象中查找唯一键

时间:2018-08-15 07:37:41

标签: json key distinct jq

我设法获取了密钥列表,但无法将其作为传递给unique的列表。

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

我想获取一个区域名称列表,即

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

我可以手动删除“核心”,“内存”等。

2 个答案:

答案 0 :(得分:2)

唯一的解决方案:

.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)

这仍将包含一些不相关的键,这些键当然可以轻松删除(例如,使用数组减法)。

答案 1 :(得分:0)

如果将JSON数据放入文件中,则可以执行以下操作:

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