2013-08-06 2 views
10

Wie bekomme ich die maximale "Rate" und den entsprechenden "log2c" Wert aus einer Datei wie folgt? z. B. die maximale Rate ist 89,5039 und log2c 3.0. Danke vielmals.Wie bekomme ich die maximale Anzahl aus einer Datei mit Linux Bash Shell Skripten

log2c=5.0 rate=88.7619 
log2c=-1.0 rate=86.5412 
log2c=11.0 rate=86.1482 
log2c=3.0 rate=89.5039 
log2c=-3.0 rate=85.5614 
log2c=9.0 rate=81.4302 
+1

Gibt es einen Grund, warum Sie dies in Awk nicht tun? Dies sollte nach nur einem kurzen Einführungs-Tutorial trivial sein. – tripleee

+0

devnulls Lösung funktioniert perfekt in bash. Der Name meiner Eingabedatei stammt jedoch von einem abrufbaren $ filename. Also setze ich diese Worte in echo "..." | Sch. Verzeih mir, ich bin ein Neuling. – Eman

Antwort

12

Verwendung sort:

sort -t= -nr -k3 inputfile | head -1 

Für die gegebene Eingabe, würde es zurück:

log2c=3.0 rate=89.5039 

Wenn Sie die Werte in Variablen lesen möchten, können Sie die eingebaute read verwenden :

$ IFS=$' =' read -a var <<< $(sort -t= -nr -k3 inputfile | head -1) 
$ echo ${var[1]} 
3.0 
$ echo ${var[3]} 
89.5039 
+0

Dann, wie Sie 89.5039 und 3.0 erhalten, danke. – Eman

+0

@ user79883 siehe oben bearbeiten. – devnull

+0

Oder 'IFS = $ '=' unbenutzte log2c ungenutzte Rate lesen <<<" $ (sort -t = -nr -k3 Eingabedatei | Kopf -1) "' – anishsane

4

Bei sehr großen Dateien ist die Verwendung von sort ziemlich langsam. In diesem Fall ist es besser, so etwas wie awk zu verwenden, die nur einen Durchlauf benötigt:

$ awk -F= 'BEGIN { max = -inf } { if ($3 > max) { max = $3; line = $0 } } END { print line }' test.txt 
log2c=3.0 rate=89.5039 

Die Zeit Komplexität dieser Operation ist linear, während der Raum Komplexität konstant ist (und klein). Erläuterung:

  1. awk -F= '...' test.txt: Invoke awk auf test.txt, mit = als Feldtrenn
  2. BEGIN { max = -inf }: Initialisiere max zu etwas, das immer kleiner sein wird als das, was Sie lesen.
  3. { if ($3 > max) { max = $3; line = $0; } }: Für jede Eingabezeile, wenn max kleiner als der Wert des dritten Feldes ($3), dann ist es zu aktualisieren und den Wert der aktuellen Zeile erinnern ($0)
  4. END { print line }: Schließlich, drucken Sie die Linie, die wir erinnerte sich beim Lesen der Eingabe.
+0

Es funktionierte nicht auf meinem Linux oder Max mit gawk 4.1.4, außer du ersetzst "print line" durch "print $ line" –

Verwandte Themen