2016-07-31 5 views
0
I0709 13:45:33.848619 3415 upgrade_proto.cpp:1044] Attempting to upgrade input file specified using deprecated 'solver_type' field (enum)': models/model 
I0709 20:02:09.081399 3415 solver.cpp:228] Iteration 101, loss = 2.25779 
I0709 20:02:09.081477 3415 solver.cpp:244]  Train net output #0: loss = 2.25779 (* 1 = 2.25779 loss) 
I0709 20:02:09.081495 3415 sgd_solver.cpp:106] Iteration 101, lr = 0.01 
I0709 20:02:20.067615 3415 solver.cpp:228] Iteration 102, loss = 2.22583 
I0709 20:02:20.067740 3415 solver.cpp:244]  Train net output #0: loss = 2.22583 (* 1 = 2.22583 loss) 

aus einer Datei wie die oben, muß ich die Zahlen 2,25779 und 2,22583 in diesem Fall und Dump jeden auf einer Linie auf eine neue Datei.Regulärer Ausdruck für Schwimmer auf grep

Ich habe versucht, so etwas wie:

cat file.txt | grep -P 'loss = .*[0-9]\n' > res.csv 

das nichts paßt tho und ich weiß nicht, wie spezifischere (nur die Zahl nicht den Verlust =) zu erhalten.

So ein:

cat res.csv 

die Ausgabe zeigen sollte:

2.25779 

2.22583 
+0

Passt nichts? Es passt "Verlust = 2,25779". – nicael

+0

Ich bekomme keine Übereinstimmungen, die res.csv ist leer, nachdem ich den Befehl – Member

+0

ausführen Just match 'Verlust \ s * = \ s * \ d' und damit fertig sein .. – sln

Antwort

0

Dies wird mit jeder auf jedem Betriebssystem sed arbeiten:

$ sed -n 's/.*loss = \([0-9.]*\)$/\1/p' file 
2.25779 
2.22583 

Nur GNU grep würde die Optionen/Syntax unterstützen Sie versuchen, zu verwenden und keine grep unterstützt, was Sie brauchen, um Ihr Ziel zu erreichen, nur einen Teil des passenden Textes auszugeben (das würde Capture-Gruppen erfordern, die grep nicht hat).

+1

Das ist genau das, was ich brauchte, vielen Dank. – Member

+0

@ A.Danischewski Nein, ist es nicht. Vielleicht haben Sie beim Kopieren/Einfügen die Verankerung '$' vergessen? –

+0

Ja, ich bin und anscheinend ist das OP einverstanden, da er es akzeptiert hat. Die Zeilen mit '#' s in der Eingabe enden nicht mit 'loss = ', wie es durch regexp '/.*loss = \ ([0-9.] * \) $ /' Ausgedrückt wird enden sie mit einem Text wie 'loss = 2.25779 (* 1 = 2.25779 loss) ', so dass sie nicht mit dem regulären Ausdruck übereinstimmen. –

0

wie folgt aussieht wird Ihnen helfen:

(?<!:)[0-9]+(\.[0-9]+) 

Es wird die Schwimmer passen, aber passt nicht zu den Mikrosekunden, wie dort:

20:02:09.081477

+0

Ich brauche nur einen bestimmten Schwimmer aus diesen Zeilen 2.25779 nicht die Zeit eins, aber danke. – Member

+0

Nur sehr wenige Werkzeuge erkennen '\ d' als eine Ziffer und nur GNU grep unterstützt PCREs, daher sollten Sie angeben, mit welchen Werkzeugen Sie arbeiten werden. –

+0

@Member Das ist, was ich gesagt habe, hervorgehoben, falls Sie es verpasst haben. – nicael

0

Sie müssen Gruppen erfassen mit()

loss = (\d*\.\d*) 
  • () ist die gefangene Gruppe
  • \d* eine beliebige Anzahl beliebiger Länge
  • \. entspricht das Zeichen . buchstäblich

Here ‚sa Leben Demo

+0

Sehr wenige Werkzeuge werden Erkenne '\ d' als Ziffer und kein Grep unterstützt Capture-Gruppen. Das Angeben einer Regexp ohne das Tool (sed, grep, awk, perl, was auch immer), das sie ausführen kann, ist praktisch nutzlos, da sie alle unterschiedliche Regexp-Varianten mit verschiedenen Optionen und Begrenzern unterstützen. –