サブフォルダから同じ名前のファイルの内容を取得し、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/
...

temperatureこのフォルダ内には2つのファイル(他の多くのファイルを含む)がありますname

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

JSONオブジェクトの配列を生成するスクリプトを作成したり、一連のbashコマンドを作成したいと思います。たとえば、 [ {"ID": "28-00000cbece94", "temp": 24.712}, {"ID": "28-00000cbeeca3", "temp": 24.735}, <so on> ] awkを含める必要があると思いますが、-execを見つけることもできますが、単純なgrep + catまたはツリーを見つけることもできます。でも。 ..

助けが必要ですか?

事前にありがとう

答え1

jq(2回)とシェルループを使用してください。

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オブジェクトを作成するために使用されます。値は単にディレクトリパス名のデフォルト名であり、温度はディレクトリのファイルから読み取られます。IDtempIDtemperature

次に、これらの個々のJSONオブジェクトを2番目のプロセスにパイプ処理し、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-outputjq

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

関連情報