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"
我可以手动删除"cores"、"memory"等
如果您将 JSON 数据放入文件中,您可以这样做:
cat data.json \
| jq '.gcp_price_list | del(.sustained_use_base,.sustained_use_tiers) | .[] | keys[]' \
| uniq
一个只有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)
这仍然会包含一些不相关的键,当然可以很容易地删除它们(例如使用数组减法)。
我设法获取了键列表,但无法将其设为传递给 unique
的列表。
https://jqplay.org/s/-YDVDeXTHb
我想获取区域名称列表,即
"asia"
"asia-east"
"asia-northeast"
"asia-south1"
"asia-southeast"
"australia"
"australia-southeast1"
我可以手动删除"cores"、"memory"等
如果您将 JSON 数据放入文件中,您可以这样做:
cat data.json \
| jq '.gcp_price_list | del(.sustained_use_base,.sustained_use_tiers) | .[] | keys[]' \
| uniq
一个只有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)
这仍然会包含一些不相关的键,当然可以很容易地删除它们(例如使用数组减法)。