我有一个仅包含两行的文件,其结构如下:
$ cat /tmp/pwpower.log
000D6F0000D34227, -114.10
000D6F0001A405C4, -130.09
这些值是我的太阳能发电厂的功率值。负值意味着生成。
我需要通过 grep/sed/awk 提取的值 - 无论是最聪明的方式。我需要单独提取两个值并且不带减号。
我现在所做的有点愚蠢,但它有效 - 我相信你们中的许多人都会为我提供更聪明的方法:-) 当然,这里我只看到值加减。
获取第一个值:
cat /tmp/pwpower.log |grep -o "\-.*" | head -n 1
获取第二个值:
cat /tmp/pwpower.log |grep -o "\-.*" | tail -n1
相关问题是,是否有一种简单的方法来获取这些 STRING 并进行转换,以便我可以计算 SUM ?
答案1
所有值:
$ awk -F '[ -]*' '$0=$NF' /tmp/pwpower.log
114.10
130.09
第一行的值:
$ awk -F '[ -]*' 'NR==1{print $NF;exit}' /tmp/pwpower.log
114.10
第二行的值:
$ awk -F '[ -]*' 'NR==2{print $NF;exit}' /tmp/pwpower.log
130.09
所有值的总和:
$ awk -F '[ -]*' '{sum+=$NF} END{print sum}' /tmp/pwpower.log
244.19
答案2
您可以使用cut
选择第二列数字,并paste -sd+
创建一系列要相加的数字。然后可以使用该工具bc
进行计算。
$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19
怎么运行的
从第二列中选择数字。
$ cut -d',' -f2 pwpower.log
-114.10
-130.09
将它们重新格式化为一行,+
每个数字之间有一个符号:
$ cut -d',' -f2 pwpower.log | paste -sd+
-114.10+ -130.09
执行计算:
$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19
要获得绝对值:
$ cut -d',' -f2 pwpower.log | sed 's/-//g' | paste -sd+ | bc
244.19
如果文件的格式pwpower.log
得到保证,您可以cut
省略减号:
$ cut -d'-' -f2 pwpower.log | paste -sd+ | bc
244.19
答案3
KISS 方法
$ awk '{print -$2; t+=-$2}; END{print t}' pwpower.log
114.1
130.09
244.19
答案4
[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19
这将进行不带负数的计算。
一般来说,我认为 cut 比 awk 更快