如何使用jq筛选JSON指定字段、添加关联字段并调整数值格式
解决Staking解绑委托数据的格式调整问题
问题场景
我需要处理以下Staking解绑委托的JSON数据:
{ "unbonding_responses": [ { "delegator_address": "tori1zkzfu5tqee0p698w3g83x8a2zswgqglj4t8z3j", "validator_address": "torivaloper189r2mx8h5zt7ep4cf0s4np79w38l420na3h6sa", "entries": [ { "creation_height": "753019", "completion_time": "2022-12-13T16:00:56.664864370Z", "initial_balance": "3000000", "balance": "3000000" } ] }, { "delegator_address": "tori1rjg0vg9hlu8kygnrdehzt3z0t4ea5ssu6wkm06", "validator_address": "torivaloper189r2mx8h5zt7ep4cf0s4np79w38l420na3h6sa", "entries": [ { "creation_height": "653923", "completion_time": "2022-12-07T00:53:48.247870844Z", "initial_balance": "50000000", "balance": "50000000" } ] }, { "delegator_address": "tori1aw44evl5zlqtw93zln83tp4v3w4kp6e9zmx64k", "validator_address": "torivaloper189r2mx8h5zt7ep4cf0s4np79w38l420na3h6sa", "entries": [ { "creation_height": "597161", "completion_time": "2022-12-03T05:32:59.107845572Z", "initial_balance": "2000000", "balance": "2000000" } ] } ], "pagination": { "next_key": null, "total": "3" } }
目前我使用这条命令处理数据:
curl -s https://rest.mainnet.teritori.com/cosmos/staking/v1beta1/validators/torivaloper1qy38xmcrnht0kt5c5fryvl8llrpdwer6atxj5u/unbonding_delegations | jq '.unbonding_responses[].entries[]|.balance|=(tonumber | ./1000000)'
得到的结果如下:
{ "creation_height": "546726", "completion_time": "2022-11-29T20:41:54.102529873Z", "initial_balance": "1000000", "balance": 1 } { "creation_height": "560257", "completion_time": "2022-11-30T18:22:32.286053755Z", "initial_balance": "4000000", "balance": 4 } { "creation_height": "567462", "completion_time": "2022-12-01T05:57:49.397647828Z", "initial_balance": "112142", "balance": 0.112142 }
我尝试用map和select调整格式但未成功,现在需要实现两个核心需求:
- 移除结果中的
initial_balance字段 - 将外层的
delegator_address字段添加到每条结果中
最终得到便于转换为CSV并导入表格的格式:
{ "delegator_address": "tori1zkzfu5tqee0p698w3g83x8a2zswgqglj4t8z3j", "creation_height": "546726", "completion_time": "2022-11-29T20:41:54.102529873Z", "balance": 1 } { "delegator_address": "tori1rjg0vg9hlu8kygnrdehzt3z0t4ea5ssu6wkm06", "creation_height": "560257", "completion_time": "2022-11-30T18:22:32.286053755Z", "balance": 4 } { "delegator_address": "tori1aw44evl5zlqtw93zln83tp4v3w4kp6e9zmx64k", "creation_height": "567462", "completion_time": "2022-12-01T05:57:49.397647828Z", "balance": 0.112142 }
解决方案
使用以下jq命令即可实现需求:
curl -s https://rest.mainnet.teritori.com/cosmos/staking/v1beta1/validators/torivaloper1qy38xmcrnht0kt5c5fryvl8llrpdwer6atxj5u/unbonding_delegations | jq '.unbonding_responses[] | .delegator_address as $addr | .entries[] | {delegator_address: $addr, creation_height, completion_time, balance: (.balance | tonumber / 1000000)}'
命令拆解说明
.unbonding_responses[]:遍历每个解绑委托的顶层条目.delegator_address as $addr:将当前条目的delegator_address存入变量$addr,方便后续复用.entries[]:遍历当前解绑委托下的每条具体记录{delegator_address: $addr, creation_height, completion_time, balance: (.balance | tonumber / 1000000)}:构造目标格式对象:- 手动添加
delegator_address字段,值为之前存储的$addr - 保留
creation_height和completion_time字段 - 转换
balance字段为数字并除以1000000完成单位换算 - 自动排除
initial_balance字段(因为新对象未包含该字段)
- 手动添加
执行结果
运行上述命令后,将直接得到你需要的目标格式:
{ "delegator_address": "tori1zkzfu5tqee0p698w3g83x8a2zswgqglj4t8z3j", "creation_height": "546726", "completion_time": "2022-11-29T20:41:54.102529873Z", "balance": 1 } { "delegator_address": "tori1rjg0vg9hlu8kygnrdehzt3z0t4ea5ssu6wkm06", "creation_height": "560257", "completion_time": "2022-11-30T18:22:32.286053755Z", "balance": 4 } { "delegator_address": "tori1aw44evl5zlqtw93zln83tp4v3w4kp6e9zmx64k", "creation_height": "567462", "completion_time": "2022-12-01T05:57:49.397647828Z", "balance": 0.112142 }
额外:直接输出CSV格式
如果需要直接生成可导入表格的CSV,可以在命令后追加CSV转换逻辑:
curl -s https://rest.mainnet.teritori.com/cosmos/staking/v1beta1/validators/torivaloper1qy38xmcrnht0kt5c5fryvl8llrpdwer6atxj5u/unbonding_delegations | jq '.unbonding_responses[] | .delegator_address as $addr | .entries[] | {delegator_address: $addr, creation_height, completion_time, balance: (.balance | tonumber / 1000000)}' | jq -r '(first | keys_unsorted) as $keys | $keys, map([.[$keys[]]])[] | @csv'
内容的提问来源于stack exchange,提问作者Erialos
相关产品推荐
相关产品推荐

