Grep resto de la línea ... después del partido


8

Tengo un archivo que contiene solo dos líneas, con la siguiente estructura:

$ cat /tmp/pwpower.log
000D6F0000D34227, -114.10
000D6F0001A405C4, -130.09

Los valores son valores de potencia de mi planta solar. Valor negativo significa generación.

Necesitaría los valores extraídos a través de grep / sed / awk, cualquiera sea la forma más inteligente. Necesito tener ambos valores extraídos por separado y sin el signo menos.

Lo que hago ahora es un poco estúpido, pero funciona. Estoy seguro de que muchos de ustedes tendrán formas más inteligentes para mí :-) Aquí, por supuesto, solo veo los valores más Menos.

Para obtener el primer valor:

cat /tmp/pwpower.log |grep -o "\-.*" | head -n 1

Para obtener el segundo valor:

cat /tmp/pwpower.log |grep -o "\-.*" | tail -n1

Y una pregunta relacionada, ¿hay una manera simple de tomar estos STRING y transformarlos para poder calcular el SUM?

Respuestas:


12

Todos los valores:

$ awk -F '[ -]*' '$0=$NF' /tmp/pwpower.log
114.10
130.09

Valor en primera línea:

$ awk -F '[ -]*' 'NR==1{print $NF;exit}' /tmp/pwpower.log
114.10

Valor en segunda línea:

$ awk -F '[ -]*' 'NR==2{print $NF;exit}' /tmp/pwpower.log
130.09

Suma de todos los valores:

$ awk -F '[ -]*' '{sum+=$NF} END{print sum}' /tmp/pwpower.log
244.19

1
Su FS no necesita ser tan complicado: -F-lo hará.
Glenn Jackman

Para una entrada más compleja, si no sabe si los campos anteriores tienen espacios, puede usar una coma como separador de campos y ejecutar todo tr -d "- "primero.
Jason C

@glennjackman La forma en que interpreto la pregunta es que el valor puede ser no negativo (sin generación), lo que rompe con solo -F-.
Adrian Frühwirth

De hecho, no lo había leído tan de cerca.
Glenn Jackman

8

Puede usar cutpara seleccionar la segunda columna de números y paste -sd+crear una serie de números para sumar. La herramienta bcse puede utilizar para hacer el cálculo.

$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19

Cómo funciona

Selecciona los números de la segunda columna.

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

Vuelva a formatearlos en una sola línea con un +signo entre cada número:

$ cut -d',' -f2 pwpower.log | paste -sd+
 -114.10+ -130.09

Realiza el cálculo:

$ cut -d',' -f2 pwpower.log | paste -sd+ | bc
-244.19

Para obtener el valor absoluto:

$ cut -d',' -f2 pwpower.log | sed 's/-//g' | paste -sd+ | bc
244.19

Si el formato del archivo pwpower.logestá garantizado, puede cutomitir el signo menos:

$ cut -d'-' -f2 pwpower.log | paste -sd+ | bc
244.19

6

Un enfoque de KISS

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

1
¿BESO? ¿Que es eso?
Bernhard

Manteniéndolo simple y estúpido;)
steeldriver

@sim sí, pero menos que leí mal, el PO pidió específicamente para el signo sea retirado
steeldriver

@steeldriver: ah, sí, está mal, me perdí esa frase enterrada allí.
slm

44
Mantenlo simple, estúpido. Para dar a entender que cuando no lo haces simple, estás siendo estúpido.
Matt

4

Me gusta su comando grep, pero podría mejorarse para eliminar el signo menos y funcionar en los casos en que no haya un signo menos. Las expresiones regulares extendidas disponibles en GNU grep con la -Ebandera nos permiten hacer coincidir un número con mayor precisión.

Es un poco más eficiente no usar cat, pero pasa el nombre del archivo como argumento al primer comando y deja que lea el archivo. También se me ocurre que si está tratando solo con la primera o la última línea del archivo, tiene más sentido usar los comandos heado tailprimero para que solo tenga que hacer coincidir una línea grep.

Primer 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

Suma (con comando awk desde aquí ):

$ 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

Esto hará el cálculo sin el menos.

Creo que cortar es más rápido que awk, en general


1

awkes la herramienta correcta, pero el número probablemente puede ser positivo (¿verdad?), lo que significa que no desea usar el signo menos como separador de campo. En su lugar, use la coma como separador de campo, luego niegue cada valor numéricamente: awkconvertirá automáticamente las cadenas en números para usted:

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

Si hay números positivos, saldrán negativos. Si solo quieres la suma, también awkpuedes hacerlo:

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

En awk puedes usarlo sqrt($2^2)como un truco para obtener un valor absoluto.
Jason C

@JasonC Eso es inteligente, pero en contexto creo que sería algo incorrecto.
zwol

0

Para sumar los dos valores:

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

Todo esto es un poco redundante. ¿Por qué demonios usar las opciones de cálculo de awk?
Bernhard

1
sí, cierto, pero me gusta bc=)
caos

1
Ohw, bueno, entonces ¿por qué usarlo awk? echo $(cut -d- -f2 file | tr '\n' '+')0 | bc
Bernhard

@Bernhard Bueno, ¿por qué usarlo cut? En su [insert_cmd_here]lugar, use , genere un bucle de subshell, invente nuevas matemáticas, use un clúster humano o aritmética mental, canalice mis pensamientos bc. ¿Por qué hacemos cosas? No hay razón para que mi respuesta sea mala.
caos

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.