Eu 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 energia 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. Eu preciso ter os dois valores extraídos 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 Minus.
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 transformar para que eu possa calcular o SUM?
fonte
-F-
será suficiente .tr -d "- "
primeiro.-F-
.Você pode usar
cut
para selecionar a segunda coluna de números epaste -sd+
criar uma série de números para adicionar. A ferramentabc
pode ser usada para fazer o cálculo.Como funciona
Seleciona os números da 2ª coluna.
Re-formata-os em uma única linha com um
+
sinal entre cada número:Executa o cálculo:
Para obter o valor absoluto:
Se o formato do arquivo
pwpower.log
estiver garantido, você poderácut
omitir o sinal de menos:fonte
Uma abordagem do KISS
fonte
Eu gosto do seu comando grep, mas poderia ser melhorado para remover o sinal de menos e funcionar nos casos em que não há sinal de menos. Expressões regulares estendidas disponíveis no GNU grep com a
-E
bandeira nos permitem corresponder um número com mais precisão.É um pouco mais eficiente não usar cat, mas passe o nome do arquivo como argumento para o primeiro comando e deixe-o ler o arquivo. Também me ocorre que, se você estiver lidando apenas com a primeira ou a última linha do arquivo, faz mais sentido usar os comandos
head
outail
primeiro, para que você só precise combinar uma linhagrep
.Primeiro valor:
Último valor:
Soma (com o comando awk daqui ):
fonte
Isso fará o cálculo sem o sinal de menos.
Eu acho que o corte é mais rápido que o awk, em geral
fonte
awk
é a ferramenta certa, mas o número provavelmente pode ser positivo (certo?), o que significa que você não deseja usar o sinal de menos como um separador de campos. Em vez disso, use a vírgula como separador de campos e, em seguida, negue numericamente cada valor -awk
converterá automaticamente as strings em números para você:Se houver algum número positivo, eles sairão negativos. Se você deseja apenas a soma,
awk
pode fazer isso também:fonte
sqrt($2^2)
como um truque para obter valor absoluto.Para somar os dois valores:
fonte
awk
?bc
=)awk
?echo $(cut -d- -f2 file | tr '\n' '+')0 | bc
cut
? Em[insert_cmd_here]
vez disso, use , gere um loop de sub-invólucro, invente novas matemáticas, use um agrupamento humano ou aritmética mental, canalize meus pensamentosbc
. Por que fazemos as coisas? Não há razão para tornar minha resposta ruim.Você também pode usar sed
fonte