将键与 jq 中子键的值映射

问题描述 投票:0回答:1

我尝试重新格式化传感器命令的输出:

sensors -j ftsteutates-i2c-0-73
{
   "ftsteutates-i2c-0-73":{
      "Adapter": "SMBus I801 adapter at efa0",
      "VCC 3.3V":{
         "in0_input": 3.331
      },
      "3.3V AUX":{
         "in1_input": 3.359
      },
      "V_IN (12V)":{
         "in2_input": 12.012
      },
      "VBAT 3.0V":{
         "in3_input": 2.692
      },
      "CPU":{
         "fan1_input": 660.000,
         "fan1_alarm": 0.000,
         "fan1_fault": 0.000
      },
      "Chassis":{
         "fan3_input": 1200.000,
         "fan3_alarm": 0.000,
         "fan3_fault": 0.000
      },
      "CPU":{
         "temp1_input": 51.000,
         "temp1_alarm": 0.000,
         "temp1_fault": 0.000
      },
      "Ambient":{
         "temp2_input": 44.000,
         "temp2_alarm": 0.000,
         "temp2_fault": 0.000
      },
      "Core":{
         "temp3_input": 54.000,
         "temp3_alarm": 0.000,
         "temp3_fault": 0.000
      },
      "Memory":{
         "temp4_input": 42.000,
         "temp4_alarm": 0.000,
         "temp4_fault": 0.000
      },
      "PCH":{
         "temp5_input": 54.000,
         "temp5_alarm": 0.000,
         "temp5_fault": 0.000
      },
      "Graphics":{
         "temp6_input": 40.000,
         "temp6_alarm": 0.000,
         "temp6_fault": 0.000
      }
   }
}

我期待的是:

sensors -j ftsteutates-i2c-0-73 | jq '."ftsteutates-i2c-0-73" | del(."Adapter") | ???' 
{
  "VCC 3.3V": 3.331,
  "3.3V AUX": 3.359,
  "V_IN (12V)": 12.012,
  "VBAT 3.0V": 2.692,
  "CPU": 51.000,
  "Chassis": 1200.000,
  "Ambient": 44.000,
  "Core": 54.000,
  "Memory": 42.000,
  "PCH": 54.000,
  "Graphics": 40.000
}

但我不知道如何映射子项的值,并删除 *_alarm 和 *_fault 子项或仅选择第一个子项,它始终是 *_input 键。

json jq
1个回答
0
投票

我得到了正确答案:

sensors -j ftsteutates-i2c-0-73 | jq '."ftsteutates-i2c-0-73" | del(."Adapter") | with_entries(.value |= if type == "object" then with_entries(select(.key | endswith("_input"))) | .[] else . end)'

此命令执行以下操作:

with_entries(.value |= if type == "object" then with_entries(select(.key | endswith("_input"))) | .[] else . end): 

迭代每个键值对,如果值是对象,则选择键以 _input 结尾的条目,然后提取值。

这给了我想要的输出

© www.soinside.com 2019 - 2024. All rights reserved.