Tenho um arquivo contendo apenas duas linhas, com a seguinte estrutura:
$ cat /tmp/pwpower.log
000D6F0000D34227, -114.10
000D6F0001A405C4, -130.09
Os valores são valores de potência da minha usina solar. Valor negativo significa geração.
Eu precisaria dos valores extraídos via grep/sed/awk - qualquer que seja a maneira mais inteligente. Preciso extrair os dois valores separadamente e sem o sinal de menos.
O que faço agora é meio estúpido, mas funciona - tenho certeza que muitos de vocês terão maneiras mais inteligentes para mim :-) Aqui, é claro, só vejo os valores mais menos.
Para obter o primeiro valor:
cat /tmp/pwpower.log |grep -o "\-.*" | head -n 1
Para obter o segundo valor:
cat /tmp/pwpower.log |grep -o "\-.*" | tail -n1
E pergunta relacionada, existe uma maneira simples de pegar essas STRINGs e transformá-las para que eu possa calcular o SUM?
Responder1
Todos os valores:
$ awk -F '[ -]*' '$0=$NF' /tmp/pwpower.log
114.10
130.09
Valor na primeira linha:
$ awk -F '[ -]*' 'NR==1{print $NF;exit}' /tmp/pwpower.log
114.10
Valor na segunda linha:
$ awk -F '[ -]*' 'NR==2{print $NF;exit}' /tmp/pwpower.log
130.09
Soma de todos os valores:
$ awk -F '[ -]*' '{sum+=$NF} END{print sum}' /tmp/pwpower.log
244.19
Responder2
Você pode usar cut
para selecionar a segunda coluna de números e paste -sd+
para criar uma série de números para somar. A ferramenta bc
pode então ser usada para fazer o cálculo.
$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19
Como funciona
Seleciona os números da 2ª coluna.
$ cut -d',' -f2 pwpower.log
-114.10
-130.09
Reformata-os em uma única linha com um +
sinal entre cada número:
$ cut -d',' -f2 pwpower.log | paste -sd+
-114.10+ -130.09
Executa o cálculo:
$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19
Para obter o valor absoluto:
$ cut -d',' -f2 pwpower.log | sed 's/-//g' | paste -sd+ | bc
244.19
Se o formato do arquivo pwpower.log
for garantido você pode cut
omitir o sinal de menos:
$ cut -d'-' -f2 pwpower.log | paste -sd+ | bc
244.19
Responder3
Uma abordagem KISS
$ awk '{print -$2; t+=-$2}; END{print t}' pwpower.log
114.1
130.09
244.19
Responder4
[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19
Isso fará o cálculo sem o sinal de menos.
Eu acho que cut é mais rápido que awk, em geral