在 Bash/Shell 中使用 jq 和 awk 将多列四舍五入到小数点后两位

igb*_*s09 1 bash awk json jq

请帮助我在此 .csv 输出中四舍五入多列。到目前为止,我已经能够将 jq 输出通过管道传输到 awk 中并仅对单个列进行四舍五入,但不知道如何对这 6 列进行四舍五入。

这是 demo.json 有效负载

{
  "XXXX": "XXX",
  "XXXXX": "XXXXXXX",
  "stack": {
    "123": {
      "overflow": 6014.4703
    },
    "234": {
      "overflow": 6090.3888
    },
    "356": {
      "overflow": 8973.8136
    },
    "244": {
      "overflow": 5034.4258
    },
    "789": {
      "overflow": 5957.6018
    },
    "545": {
      "overflow": 1225.7363
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

下面是我迄今为止用于单列综述的代码行

cat demo.json | jq -r --argjson H "$(date +%H -d "1 hour ago")" '["Hours", "A", "B", "C", "D", "E", "F"], ([.stack."123".overflow/1000, .stack."234".overflow/1000, .stack."356".overflow/1000, .stack."244".overflow/1000, .stack."789".overflow/1000, .stack."545".overflow/1000] | [$H] + .) | @csv' | awk 'BEGIN{ FS=OFS="," }NR>1{ $3=sprintf("%.2f", $3) }1' > demo.csv
Run Code Online (Sandbox Code Playgroud)

我想要实现的目标

"Hour","A","B","C","D","E","F"
"09","6.01","6.09","8.97","5.03","5.96","1.23"
Run Code Online (Sandbox Code Playgroud)

pmf*_*pmf 8

按如下方式更新|=相关列/字段:除以10,然后round除以100

.stack[].overflow |= (. / 10 | round / 100)
Run Code Online (Sandbox Code Playgroud)
{
  "XXXX": "XXX",
  "XXXXX": "XXXXXXX",
  "stack": {
    "123": {
      "overflow": 6.01
    },
    "234": {
      "overflow": 6.09
    },
    "356": {
      "overflow": 8.97
    },
    "244": {
      "overflow": 5.03
    },
    "789": {
      "overflow": 5.96
    },
    "545": {
      "overflow": 1.23
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

演示