Grep Rest der Linie ... nach dem Spiel


8

Ich habe eine Datei mit nur zwei Zeilen mit der folgenden Struktur:

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

Die Werte sind Leistungswerte meiner Solaranlage. Negativer Wert bedeutet Erzeugung.

Ich würde die über grep / sed / awk extrahierten Werte benötigen - was auch immer der klügste Weg ist. Ich muss beide Werte separat und ohne Minuszeichen extrahieren lassen.

Was ich jetzt mache, ist irgendwie dumm, aber es funktioniert - ich bin sicher, dass viele von euch klügere Wege für mich haben werden :-) Hier sehe ich natürlich nur die Werte plus Minus.

So erhalten Sie den ersten Wert:

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

So erhalten Sie den zweiten Wert:

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

Und die verwandte Frage: Gibt es eine einfache Möglichkeit, diese STRINGs zu nehmen und zu transformieren, damit ich die SUMME berechnen kann?

Antworten:


12

Alle Werte:

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

Wert in der ersten Zeile:

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

Wert in der zweiten Zeile:

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

Summe aller Werte:

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

1
Ihr FS muss nicht so kompliziert sein: -F-wird es tun.
Glenn Jackman

Wenn Sie bei komplexeren Eingaben nicht wissen, ob vorhergehende Felder Leerzeichen enthalten, können Sie ein Komma als Feldtrennzeichen verwenden und das Ganze tr -d "- "zuerst durchlaufen .
Jason C

@glennjackman Die Art und Weise, wie ich die Frage interpretiere, ist, dass der Wert nicht negativ sein kann (keine Generation), was mit gerecht bricht -F-.
Adrian Frühwirth

In der Tat hatte ich nicht so genau gelesen.
Glenn Jackman

8

Sie können cutdie zweite Zahlenspalte auswählen und paste -sd+eine Reihe von Zahlen erstellen, die zusammenaddiert werden sollen. Das Tool bckann dann zur Berechnung verwendet werden.

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

Wie es funktioniert

Wählt die Zahlen aus der 2. Spalte aus.

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

Formatiert sie in eine einzelne Zeile mit einem +Vorzeichen zwischen jeder Nummer neu:

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

Führt die Berechnung durch:

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

Um den absoluten Wert zu erhalten:

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

Wenn das Format der Datei pwpower.loggarantiert ist, können Sie cutdas Minuszeichen weglassen:

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

6

Ein KISS-Ansatz

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

1
KUSS? Was ist das?
Bernhard


@sim ja, aber wenn ich nicht falsch verstanden habe, hat das OP ausdrücklich darum gebeten, dass das Schild entfernt wird
Steeldriver

@steeldriver - ah ja mein schlechtes, ich habe den dort vergrabenen Satz verpasst.
slm

4
Halten Sie es einfach blöd. Um zu implizieren, wenn Sie es nicht einfach halten, sind Sie dumm.
Matt

4

Ich mag Ihren Befehl grep, aber es könnte verbessert werden, das Minuszeichen zu entfernen und in Fällen zu arbeiten, in denen es kein Minuszeichen gibt. Erweiterte reguläre Ausdrücke, die in GNU grep mit dem -EFlag verfügbar sind, ermöglichen es uns, eine Zahl genauer zuzuordnen.

Es ist etwas effizienter, cat nicht zu verwenden, sondern den Dateinamen als Argument an den ersten Befehl zu übergeben und die Datei lesen zu lassen. Mir fällt auch ein, dass es sinnvoller ist, zuerst die Befehle headoder zu verwenden, wenn Sie nur die ersten oder letzten Zeilen aus der Datei tailbearbeiten, damit Sie nur mit einer Zeile übereinstimmen müssen grep.

Erster Wert:

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

Letzter Wert:

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

Summe (mit awk Befehl von hier ):

$ 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

Dadurch wird die Berechnung ohne Minus durchgeführt.

Ich denke, Schnitt ist im Allgemeinen schneller als awk


1

awkist das richtige Werkzeug, aber die Zahl wahrscheinlich kann positiv sein (oder?), was bedeutet , dass Sie nicht auf das Minuszeichen als Feldtrennzeichen verwenden möchten. Verwenden Sie stattdessen das Komma als Feldtrennzeichen und negieren Sie dann jeden Wert numerisch. awkDadurch werden Zeichenfolgen automatisch in Zahlen umgewandelt:

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

Wenn es positive Zahlen gibt, werden sie negativ. Wenn Sie nur die Summe wollen, awkkönnen Sie das auch tun:

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

In awk können Sie sqrt($2^2)als Trick verwenden, um den absoluten Wert zu erhalten.
Jason C

@ JasonC Das ist klug, aber im Kontext glaube ich, dass es das Falsche wäre.
zwol

0

Um die beiden Werte zu summieren:

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

Das alles ist etwas überflüssig. Warum um alles in der Welt nicht die Berechnungsoptionen von verwenden awk?
Bernhard

1
Ja, stimmt, aber ich mag bc=)
Chaos

1
Na ja, warum dann verwenden awk? echo $(cut -d- -f2 file | tr '\n' '+')0 | bc
Bernhard

@Bernhard Nun, warum verwenden cut? Verwenden Sie [insert_cmd_here]stattdessen eine Subshell-Schleife, erfinden Sie neue Mathematik, verwenden Sie einen menschlichen Cluster oder eine mentale Arithmetik und leiten Sie meine Gedanken ein bc. Warum machen wir Dinge? Kein Grund, meine Antwort schlecht zu machen.
Chaos

0

Sie können sed auch verwenden

$-sed -r 's/[^-]+.(.*)/\1/g' /tmp/pwpower.log
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.