You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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对应同一个虚拟值,可分两步执行:

  1. 先生成唯一原值到虚拟值的映射表:
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
  1. 再使用映射表替换原JSON中的computer_name:
jq --argfile map name_mapping.json '
  map(.computer_name = $map[.computer_name])
' file.json > modified_hosts.json

内容的提问来源于stack exchange,提问作者schmilk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:00:58