如何为JSON匹配字段替换递增唯一值并导出原值映射?
解决JSON数组的jq字段访问错误,同时实现主机名替换与映射表生成
错误原因分析
你遇到的jq: error: Cannot index array with string "computer_name"错误,是因为你的JSON文件根结构是数组(所有主机数据被包裹在[]中)。直接使用.computer_name是尝试在数组对象上索引字符串键,这不符合jq的语法规则——数组只能通过数字索引访问元素,你需要先遍历数组中的每个主机对象,再访问其字段。
正确的字段筛选命令应该是:
jq '.[].computer_name' file.json
其中.[]用于遍历数组内的每个主机对象,后续的.computer_name才能正确提取对应字段的值。
实现主机名替换与映射表生成
针对你需要将每台主机的computer_name替换为DummyXXXXXX格式的唯一递增虚拟值,并导出原值与虚拟值映射表的需求,提供两种方案:
方案1:为每个主机分配递增虚拟值(允许重复原值对应不同虚拟值)
此方案会为数组中的每一台主机依次分配递增编号,即使多台主机的computer_name相同,也会得到不同的虚拟值。
执行以下命令,将修改后的JSON保存到modified_hosts.json,映射表保存到name_mapping.json:
jq -n ' ($counter := 0) | ($mapping := {}) | ($raw_data := inputs) | $raw_data | map( .computer_name |= ( $counter += 1 | $mapping[.] = "Dummy\($counter|tostring|lpad(5; "0"))" | $mapping[.] ) ) | . , $mapping | (.[0] | tojson), (.[1] | tojson) 2>&1 ' file.json > modified_hosts.json 2> name_mapping.json
方案2:为唯一原值分配唯一虚拟值(相同原值对应同一虚拟值)
如果需要相同的computer_name对应同一个虚拟值,可分两步执行:
- 先生成唯一原值到虚拟值的映射表:
jq -n ' ($unique_names := inputs | map(.computer_name) | unique) | ($unique_names | enumerate | map({(.[1]): "Dummy\((.[0]+1)|tostring|lpad(5; "0"))"}) | add) ' file.json > name_mapping.json
- 再使用映射表替换原JSON中的
computer_name:
jq --argfile map name_mapping.json ' map(.computer_name = $map[.computer_name]) ' file.json > modified_hosts.json
内容的提问来源于stack exchange,提问作者schmilk
相关产品推荐
相关产品推荐

