我有一个连接到* nix系统的温度传感器,典型的输出类似于:
pi@raspberrypi $ cat /sys/bus/w1/devices/28-00000202070c/w1_slave
c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12187
结果没有任何逗号,但假设在逗号后总是带有3位数,所以在这个例子中将是12.187º。
我已经实现了一个过滤器,它在第二个char之后放置一个逗号,它大部分时间都可以运行:
grep t= | awk '{print $10;}'| sed 's/t\=//g' | sed 's/\([0-9][0-9]\)\([0-9]\)/\1,\2/g'
然而,在冬季,温度降至10º以下,我的过滤器返回值为95,32º(当它应为9,532º时)。
有没有办法从右边计算字符,所以我总是可以计算3个数字字符(并避免在10º以下的温度下出现这个问题)?
谢谢, Joaoabs
答案 0 :(得分:1)
awk可以处理浮点运算:
awk '/t=/ { sub(/t=/,"",$NF); print $NF/1000}' /sys/bus/w1/devices/28-00000202070c/w1_slave
答案 1 :(得分:1)
如果我理解正确,那么你想要做的是:
sed 's/\([0-9][0-9][0-9]\)$/,\1/g'
正则表达式中的 $
表示“结束”,因此这会在字符串末尾搜索3位数字,并将其替换为逗号+找到的数字。
(注意:这应该是管道的最后一部分,开头不变。)
答案 2 :(得分:1)
使用awk
awk -F= '/t=/ {print $NF/1000}' /sys/bus/w1/devices/28-00000202070c/w1_slave
12.187
或将其存储到变量:
temp=$(awk -F= '/t=/ {print $NF/1000}' /sys/bus/w1/devices/28-00000202070c/w1_slave)
echo "$temp"
12.187
答案 3 :(得分:0)
不要grep|awk|sed|sed...
,请尝试:
...|awk -F't=' -v OFS='t=' 'NF>1{$2=sprintf("%'\''d",$2)}7'
使用您的数据进行测试:
kent$ echo "c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12187"|awk -F't=' -v OFS='t=' 'NF>1{$2=sprintf("%'\''d",$2)}7'
c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12,187
awk在'printf'中有您的要求的格式模式。只是使用它。
如果您只想获得t =值:
awk -F't=' -v OFS='t=' 'NF>1{printf "%'\''d\n",$2}'
使用相同的输入:
kent$ echo "c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12187"|awk -F't=' -v OFS='t=' 'NF>1{printf "%'\''d\n",$2}'
12,187