Grep rest of line… depois da partida

8

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 o caminho mais inteligente. Preciso ter os dois valores extraídos separadamente e sem o sinal de menos.

O que eu faço agora é meio estúpido, mas funciona - tenho certeza que muitos de vocês terão maneiras mais inteligentes para mim :-) É claro que só vejo os valores mais o 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 uma questão relacionada, existe uma maneira simples de pegar esses STRINGs e transformar para que eu possa calcular a SUM?

    
por njordan 17.06.2014 / 12:01

8 respostas

12

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
    
por 17.06.2014 / 12:13
8

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 segunda coluna.

$ cut -d',' -f2 pwpower.log 
 -114.10
 -130.09

Re-formata-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ê poderá ter cut omitindo o sinal de menos:

$ cut -d'-' -f2 pwpower.log | paste -sd+ | bc
244.19
    
por 17.06.2014 / 13:33
6

Uma abordagem do KISS

$ awk '{print -$2; t+=-$2}; END{print t}' pwpower.log 
114.1
130.09
244.19
    
por 17.06.2014 / 12:23
4

Gosto do seu comando grep, mas ele pode 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 o sinal -E nos permitem combinar um número com mais precisão.

É um pouco mais eficiente não usar cat, mas passar o nome do arquivo como um argumento para o primeiro comando e deixá-lo ler o arquivo. Também me ocorre que, se você está lidando apenas com a primeira ou a última linha do arquivo, faz mais sentido usar os comandos head ou tail primeiro, para que você só tenha que corresponder a uma linha com grep .

Primeiro valor:

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

Último valor:

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

Sum (com o comando awk do aqui ):

$ grep -oE '[0-9\.]+$' /tmp/pwpower.log | awk '{s+=$1} END {print s}'
244.19
    
por 17.06.2014 / 15:49
3
[root@ip-10-186-149-181 ~]# cut -d '-' -f2 /tmp/pwpower.log | paste -sd+ | bc
244.19

Isso fará o cálculo sem o menos.

Eu acho que o corte é mais rápido que o awk, em geral

    
por 17.06.2014 / 13:59
1

awk é a ferramenta certa, mas o número provavelmente pode ser positivo (certo?), o que significa que você não quer usar o sinal de menos como um separador de campo. Em vez disso, use a vírgula como o separador de campo e, em seguida, negue cada valor numericamente - awk converterá automaticamente as strings em números para você:

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

Se houver algum número positivo, ele será negativo. Se você quer apenas a soma, awk também pode fazer isso:

$ awk -F, '{ sum += -$2 } END { print sum }' < /tmp/pwpower.log
244.19
    
por 17.06.2014 / 21:59
0

Para somar os dois valores:

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

Você pode usar sed também

$-sed -r 's/[^-]+.(.*)//g' /tmp/pwpower.log
    
por 18.06.2014 / 07:46