使用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,并以相同的格式返回数组。我尝试以以下方式使用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后,如何返回对象数组?

告诉jq替换"吞吐量(Ktps(";除以1000:

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

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

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

您可以使用更新分配操作符

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

但是jq为您提供了更多的算术更新分配,例如+=*=/=,这样您就可以进行

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

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

在线试用!