Grep其余部分…比赛结束后


8

我有一个仅包含两行的文件,具有以下结构:

$ 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?

Answers:


12

所有值:

$ 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

1
您的FS不必那么复杂:-F-可以。
glenn jackman 2014年

对于更复杂的输入,如果您不知道前面的字段是否有空格,则可以使用逗号作为字段分隔符,并首先运行整个过程tr -d "- "
詹森·C

@glennjackman我解释问题的方式是,该值可以是非负数(无代数),该值以just中断-F-
AdrianFrühwirth,2014年

确实,我没有仔细阅读过。
glenn jackman 2014年

8

您可以使用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

6

亲吻方法

$ awk '{print -$2; t+=-$2}; END{print t}' pwpower.log 
114.1
130.09
244.19

1
吻?那是什么?
Bernhard 2014年

保持简单和愚蠢;)
steeldriver 2014年

@sim是的,但除非我有误读,否则操作员特别要求删除该标志
钢铁驾驶员

@steeldriver-啊,是的,我不好,我错过了那句话。
slm

4
保持简单,愚蠢。暗示一下,如果您不保持简单,那就很愚蠢。
马特

4

我喜欢您的grep命令,但是可以删除负号进行改进,并且可以在没有负号的情况下工作。带-E标志的GNU grep中可用的扩展正则表达式使我们能够更精确地匹配数字。

不使用cat而是将文件名作为参数传递给第一个命令并让其读取文件,效率会更高。我还想到,如果只处理文件的第一行或最后一行,则首先使用heador tail命令更为合理,这样您只需要与匹配grep

第一个值:

$ head -n 1 /tmp/pwpower.log | grep -oE '[0-9\.]+$' 
114.10

最后值:

$ tail -n 1 /tmp/pwpower.log | grep -oE '[0-9\.]+$'
130.09

总和(从此处使用awk命令):

$ grep -oE '[0-9\.]+$' /tmp/pwpower.log | awk '{s+=$1} END {print s}'
244.19

3
[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19

这将进行计算而不会减。

我认为剪切通常比awk快


1

awk是正确的工具,但数量大概可以肯定的(是吗?),这意味着你希望使用减号作为一个字段分隔符。取而代之的是,使用逗号作为字段分隔符,然后对每个值awk进行数字求反- 会自动为您将字符串转换为数字:

$ awk -F, '{ print -$2 }' < /tmp/pwpower.log
114.1
130.09

如果碰巧有正数,它们就会变成负数。如果您只想要总和,awk也可以这样做:

$ awk -F, '{ sum += -$2 } END { print sum }' < /tmp/pwpower.log
244.19

在awk中,您可以使用sqrt($2^2)技巧来获取绝对值。
詹森·C

@JasonC这很聪明,但是在上下文中,我认为这样做是错误的。
zwol 2014年

0

总结两个值:

(awk -F- '{printf "%s+", $2}' /tmp/pwpower.log; echo 0) | bc -l

这一切都是多余的。为什么地球上使用nog的计算选项awk
Bernhard 2014年

1
是的,是的,但我喜欢bc=)
混乱

1
哦,那么,为什么要使用awkecho $(cut -d- -f2 file | tr '\n' '+')0 | bc
Bernhard 2014年

@Bernhard好,为什么使用cut?请[insert_cmd_here]改用,生成subshel​​l循环,发明新的数学,使用人工聚类或思维算术,将我的想法引入bc。我们为什么要做事?没有理由让我的答案不好。
混乱

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.