如何用jq根据satelliteName匹配更新对应的auditScore值?
解决指定satelliteName对应的auditScore更新问题
问题根源
你之前的命令.[]|select(.satelliteName=="us2.storj.io:7777")报错,是因为.[]会遍历根对象的所有值,其中storageSummary是数字类型,尝试访问它的satelliteName属性必然报错。
解决方案
方案一:通用处理(适合未知audit字段数量的情况)
使用to_entries和from_entries转换结构,筛选目标对象并修改:
to_entries | map( if .value.satelliteName == "us2.storj.io:7777" then .value.auditScore = 0.9 # 替换成你需要的新值 else . end ) | from_entries
命令说明:
to_entries:将原对象转换为键值对数组(如[{"key":"storageSummary","value":68624392000000}, ...])map:遍历数组,对匹配satelliteName的对象更新auditScore,其余保持原样from_entries:将处理后的键值对数组转回原对象结构,保留storageSummary不变
方案二:针对性处理(适合已知audit字段名称的情况)
直接逐个检查audit字段,避免遍历非对象值:
. |= ( .audit1 |= (if .satelliteName == "us2.storj.io:7777" then .auditScore = 0.9 else . end) | .audit2 |= (if .satelliteName == "us2.storj.io:7777" then .auditScore = 0.9 else . end) | .audit3 |= (if .satelliteName == "us2.storj.io:7777" then .auditScore = 0.9 else . end) )
验证效果
执行方案一命令后,输出的JSON会更新目标对象的auditScore,其余内容保持不变:
{ "storageSummary": 68624392000000, "audit1": { "auditScore": 0.9, "suspensionScore": 1, "onlineScore": 0.99743587, "satelliteName": "us2.storj.io:7777" }, "audit2": { "auditScore": 1, "suspensionScore": 1, "onlineScore": 0.9992917, "satelliteName": "saltlake.tardigrade.io:7777" }, "audit3": { "auditScore": 1, "suspensionScore": 1, "onlineScore": 0.99930555, "satelliteName": "ap1.storj.io:7777" } }
内容的提问来源于stack exchange,提问作者Burps
相关产品推荐
相关产品推荐

