7

これを変換するために sed を使用して小さなスクリプトを作成しました。

kaefert@Ultrablech ~ $ cat /sys/class/power_supply/BAT0/uevent
POWER_SUPPLY_NAME=BAT0
POWER_SUPPLY_STATUS=Full
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CYCLE_COUNT=0
POWER_SUPPLY_VOLTAGE_MIN_DESIGN=7400000
POWER_SUPPLY_VOLTAGE_NOW=8370000
POWER_SUPPLY_POWER_NOW=0
POWER_SUPPLY_ENERGY_FULL_DESIGN=45640000
POWER_SUPPLY_ENERGY_FULL=44541000
POWER_SUPPLY_ENERGY_NOW=44541000
POWER_SUPPLY_MODEL_NAME=UX32-65
POWER_SUPPLY_MANUFACTURER=ASUSTeK
POWER_SUPPLY_SERIAL_NUMBER= 

次のような csv ファイル形式に変換します。

kaefert@Ultrablech ~ $ Documents/Asus\ Zenbook\ UX32VD/power_to_csv.sh 
"date";"status";"voltage µV";"power µW";"energy full µWh";"energy now µWh"
2012-07-30 11:29:01;"Full";8369000;0;44541000;44541000 
2012-07-30 11:29:02;"Full";8369000;0;44541000;44541000 
2012-07-30 11:29:04;"Full";8369000;0;44541000;44541000
... (in a loop)

私が今したいのは、これらの数値のそれぞれを 1.000.000 で割って、μV ではなく、μW ではなく V と W を表し、一目で簡単に解釈できるようにすることです。もちろん、このcsvをlibre office calc内で開いたら、後で手動でこれを行うこともできますが、自動化したいと思います。

だから私が見つけたのは、次のようにsedの間に外部プログラムを呼び出すことができるということです:

...
s/\nPOWER_SUPPLY_PRESENT=1\nPOWER_SUPPLY_TECHNOLOGY=Li-ion\nPOWER_SUPPLY_CYCLE_COUNT=0\nPOWER_SUPPLY_VOLTAGE_MIN_DESIGN=7400000\nPOWER_SUPPLY_VOLTAGE_NOW=\([0-9]\{1,\}\)/";'`echo 0`'\1/

そして、次のような方法で必要な値を取得できることを確認します。

echo "scale=6;3094030/1000000" | bc | sed 's/0\{1,\}$//'

しかし、ここでの問題は、一致する "\1" を外部コマンドに渡すにはどうすればよいかということです。

完全なスクリプトに興味がある場合は、http: //koega.no-ip.org/mediawiki/index.php/Battery_info_to_csvで見つけることができます。

4

3 に答える 3

9

あなたのsedがGNU sedの場合。「e」を使用して、一致したグループを sed コマンド内の外部コマンド/ツールに渡すことができます。

例はそれを明確にするのに役立つかもしれません:

たとえば、
文字列"120+20foobar"の 120+20 部分の計算結果を取得し、「foobar」部分の「oo」を「xx」に置き換えたいとします。

この例は、上記の問題を解決するためのものではなく、sed 'e' の使用法を示すためのものであることに注意してください。

したがって120+20、最初の一致グループで作成し、2 番目のグループで休んでから、2 つのグループを異なるコマンド/ツールに渡して結果を得ることができます。お気に入り:

   kent$  echo "100+20foobar"|sed -r 's#([0-9+]*)(.*)#echo  \1 \|bc\;echo \2 \| sed "s/oo/xx/g"#ge'
    120
    fxxbar

このようにして、迷子になるまで、多くの sed を別の sed にネストできます。:D

于 2012-07-30T10:20:31.367 に答える
2

sed単独では算術演算を行わないため、このような用途に使用することをお勧めしますawk。たとえば、3 番目、5 番目、6 番目のフィールドを 100 万で割るには、次のようにします。

 awk -F';' -v OFS=';' '
   NR == 1
   NR != 1 { 
     $3 /= 1e6
     $5 /= 1e6
     $6 /= 1e6
     print
   }'

説明

  • -F';'-v OFS=';'入力フィールドと出力フィールドのセパレータを指定します。
  • NR == 1 最初の行を変更せずに通過させます。
  • NR != 11 行目でない場合は、分割して印刷します。
于 2012-07-30T10:08:38.160 に答える
0

直接 1,000,000 で割るには、次のようにします。

Q='3094030/1000000'
sed ':r /^[[:digit:]]\{7\}/{s$\([[:digit:]]*\)\([[:digit:]]\{6\}\)/1000000$\1.\2$;p;d};s:^:0:;br;d'
于 2012-07-30T10:09:25.067 に答える