【问题标题】:Modifying the same field in an array of objects using jq使用 jq 修改对象数组中的相同字段
【发布时间】:2020-11-09 16:29:41
【问题描述】:

我有一个对象数组,其中每个对象的结构如下:

 {
   "impl": "pmdk",
   "pc_writes": 50,
   "threads": 1,
   "throughput (K tps)": 703014,
   "med_latency (ns)": 1334,
   "99_latency (ns)": 2358,
   "exec_time (s)": 14224471006
 }

我想将每个对象中的"throughput (K tps)" 字段除以1000,并以相同的格式返回数组。我尝试通过以下方式使用map_values

map_values(."throughput (K tps)"/1000)

但它只返回一个修改后的值数组:

[703.014,...]

而不是整个对象,像这样:

 [{
   "impl": "pmdk",
   "pc_writes": 50,
   "threads": 1,
   "throughput (K tps)": 703.014,
   "med_latency (ns)": 1334,
   "99_latency (ns)": 2358,
   "exec_time (s)": 14224471006
 },
 ...
 ]

如何将其中一个字段除以 1000 后返回一个对象数组?

【问题讨论】:

    标签: json jq edit


    【解决方案1】:

    告诉jq将“吞吐量(K tps)”中的值替换为自身除以1000:

    jq '.[]."throughput (K tps)" |= . / 1000' file.json
    

    【讨论】:

      【解决方案2】:

      您可以使用mapmap_values 来解决您的问题。但是您尝试的问题是您修改了字段 "throughput (K tps)" 以打印到输出中。

      没有|=更新赋值运算符,只有表达式中提到的字段会被打印到控制台。

      您可以使用Update-assignment 运算符

      map(."throughput (K tps)" |= . / 1000)
      

      但是jq 给了你更多的工作,Arithmetic update assignments 形式为+=*=/=,所以你可以做

      map(."throughput (K tps)" /= 1000)
      

      【讨论】:

        【解决方案3】:
        jq '.[] | ."throughput (K tps)" |= . / 1000'
        

        应编辑每个throughput (K tps),将其除以 1000。

        Try it online!


        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 2020-02-02
          • 1970-01-01
          相关资源
          最近更新 更多