获取子文件夹下同名文件内容,得到JSON数组

获取子文件夹下同名文件内容,得到JSON数组

我的文件位于以28-.

它们是用于测量温度的一根线总线传感器。 Raspberry 通过其 SPI 接口识别它们;每个探测器都有其 ID(以 28- 开头),RB 为每个传感器创建一棵树,命名为探测器的 ID,例如

ls /sys/bus/w1/devices/w1_bus_master1 -1
28-00000cbece94/
28-00000cbeeca3/
28-00000cbeedf6/
28-00000cbf87ba/
...

该文件夹内有两个文件(还有许多其他文件),分别是temperaturename

name是探针 ID,也是文件夹名称;temperature是(……令人惊讶的)温度。

其中 ID 既是文件夹名称又是文件内容:

cat /sys/bus/w1/devices/w1_bus_master1/28-00000cc002fa/name 
28-00000cc002fa

温度是

cat /sys/bus/w1/devices/w1_bus_master1/28-00000cc002fa/temperature 
21812

我想编写一个脚本或编写一系列 bash 命令,最终生成一个 JSON 对象数组,例如: [ {"ID": "28-00000cbece94", "temp": 24.712}, {"ID": "28-00000cbeeca3", "temp": 24.735}, <so on> ] 我认为 awk 应该参与其中,但也许 find -exec,但一个简单的 grep+cat 甚至是树,但是。 ..

有什么帮助吗?

提前致谢

答案1

仅使用jq(两次)和 shell 循环:

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
    jq -n \
        --arg ID "$(basename "$pathname")" \
        --arg temp "$(cat "$pathname"/temperature)" \
        '{ ID: $ID, temp: $temp }'
done |
jq -s '. | map( .temp = (.temp | tonumber / 1000) )'

该循环迭代与以28-您在问题中提到的目录开头的目录相对应的路径名。该循环用于jq为每个目录创建一个 JSON 对象,由一个ID元素和一个temp元素组成。的值ID只是目录路径名的基本名称,并且温度是从temperature目录中的文件中读取的。

然后,这些单独的 JSON 对象通过管道传输到第二个进程,该进程使用( ) 选项jq创建它们的数组。它还通过将每个对象的元素从字符串转换为数字并将其除以 1000 来修改它(这是你从未说过的事情,所以我猜测)。-s--slurptemp

同样的事情,但是jo在循环内使用稍微方便的实用程序:

for pathname in /sys/bus/w1/devices/w1_bus_master1/28-*/; do
    jo  ID="$(basename "$pathname")" \
        temp="$(cat "$pathname"/temperature)"
done |
jq -s '. | map( .temp /= 1000 )'

jo实用程序还检测到这temp是一个数字,因此我们不必稍后将它们从字符串转换。

这两个循环都会创建“漂亮打印”的 JSON,例如

[
  {
    "ID": "28-00000cbece90",
    "temp": 21.812
  },
  {
    "ID": "28-00000cbece91",
    "temp": 21.812
  }
]

-c( --compact-output) 选项添加到最后jq,以生成紧凑的输出,例如

[{"ID":"28-00000cbece90","temp":21.812},{"ID":"28-00000cbece91","temp":21.812}]

相关内容