使用 jq 修改对象数组中的相同字段

Modifying the same field in an array of objects using jq

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

 {
   "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,并以相同的格式 return 数组。我尝试按以下方式使用 map_values

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

但它只是 return 一个修改值数组:

[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
 },
 ...
 ]

我如何 return 对象数组中的一个字段除以 1000 后?

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

应将每个 throughput (K tps) 除以 1000 进行编辑。

Try it online!


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

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

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

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

您可以使用 Update-assignment 运算符

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

但是 jq 为您提供了 +=*=/= 形式的更多工作 Arithmetic update assignments,因此您可以

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