2010-12-16 6 views
1

Ich habe viele Protokolldateien wie folgt aus:So sortieren Sie nach hh: mm: ss.xx in ksh in AIX 5.3?


......
......
CPU-Zeit 9,05 Sekunden
Echtzeit 8: 02.07
.... ..
......
CPU-Zeit 2: 25.23
Echtzeit 1: 39: 44,15
......
......


Um all die Zeiten zu bekommen, grep ich einfach alle CPU-Zeit und Echtzeit.
Sortieren Sie die Grep-Ausgabedateien.
Ich benutze AIX 5.2, gibt es nach String oder nach numeric sortiert.
Aber es gibt keine Art von Stunde: Minute: Sekunde.

Um dieses Problem zu lösen, übergebe ich die grep Ausgangsleitungen zu einer While-Schleife.
Erstellen Sie dann eine neue Variablen sed mit 's /:/00/g'
Diese neue var machen die hh: mm: ss.xx wird durch diese neue Variable als numerisch hh00mm00ss.xx
und dann sortieren.

Auf diese Weise kann ich die zeitaufwendigsten Schritte herausfinden.
Diese Arbeit kann umgehen, aber die Geschwindigkeit ist ein bisschen langsam.

Kann jemand eine bessere Alternative haben?
Vielen Dank im Voraus.

Alvin SIU

Antwort

0

In dem Papier ‚Theorie und Praxis in den Bau einer Arbeits Sortieren Routine‘, JP Linderman zeigt, dass die beste Art und Weise aus dem System sort Befehl gute Leistung zu erhalten (die ist "Sortierroutine", an der er arbeitete, mit komplexen Schlüsseln, um Befehle zum Erzeugen von Schlüsseln zu erzeugen, die die Vergleiche vereinfachen. Im Beispiel war die Art Befehl mit den komplexen Schlüsseln:

sort -t' ' -k 9,9.2 -k3 -k17 

Der alternative Mechanismus verwendet, um einen Schlüsselgenerator sie leicht zu sortieren zu machen:

keygen | sort | keystrip 

und der Schlüssel-Generator war:

awk -F' ' '{printf "%s:%s:%s:%s\n", substr($9, 1, 2), $3, $17, $0}' 

und der Schlüssel Stripper war:

awk -F':' {printf "%s\n", $4}' 

Für die Testdaten, mit denen Lindeman arbeitete, wurde die verstrichene Zeit von etwa 2100 Sekunden für den komplizierten Sortierbefehl auf etwa 600 Sekunden für die awk | sort | awk Kombination reduziert.


diese Idee hier Annahme, würde ich einen Perl-Skript verwenden, um die unterschiedlichen Zeitwert einheitlich in einem Format zu präsentieren, dass sort triviale Weise handhaben kann.

In diesem Fall scheinen Sie eine Vielzahl von Zeitformaten zu befürchten:

cpu time 9.05 seconds 
real time 8:02.07 
cpu time 2:25.23 
real time 1:39:44.15 

Es ist nicht klar, ob Sie den Kontext der Linien Sie sortieren, aber es scheint erhalten müssen ich, dass ich die Zeiten in eine kanonische Form umwandeln würde. Müssen Sie 3-stellige Echtzeitstunden berücksichtigen? Wenn die Zeit auf 20,05 Sekunden geht, bleibt das Suffix? Wenn die Zeit auf 80,05 Sekunden geht, wird das als 1: 20.05 gedruckt? ja, ich nehme an, dass ...

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<>) 
{ 
    if ($_ =~ m/ (?:cpu|real)\stime\s 
       (?: 
       (?:(\d+):)?  # Hours 
       (\d\d?):   # Minutes 
       )? 
       (\d\d?(?:\.\d+)) # Seconds 
       /msx) 
    { 
     my($hh, $mm, $ss) = ($1, $2, $3); 
     $hh //= 0; 
     $mm //= 0; 
     $_ = sprintf "%03d:%02d:%05.2f|%s", $hh, $mm, $ss, $_; 
    } 
    print; 
} 

die Eingangsdaten Gegeben:

cpu time 9.05 seconds 
real time 8:02.07 
cpu time 2:25.23 
real time 1:39:44.15 
cpu time 25.23 seconds 
real time 39:44.15 
cpu time 5.23 seconds 
real time 44.15 seconds 
real time 1:44.15 
real time 1:04.15 
real time 21:04.15 
real time 1:01:04.15 
real time 32:21:04.15 
real time 122:21:04.15 

Dies erzeugt die Ausgangsdaten:

000:00:09.05|cpu time 9.05 seconds 
000:08:02.07|real time 8:02.07 
000:02:25.23|cpu time 2:25.23 
001:39:44.15|real time 1:39:44.15 
000:00:25.23|cpu time 25.23 seconds 
000:39:44.15|real time 39:44.15 
000:00:05.23|cpu time 5.23 seconds 
000:00:44.15|real time 44.15 seconds 
000:01:44.15|real time 1:44.15 
000:01:04.15|real time 1:04.15 
000:21:04.15|real time 21:04.15 
001:01:04.15|real time 1:01:04.15 
032:21:04.15|real time 32:21:04.15 
122:21:04.15|real time 122:21:04.15 

, die in einem einfachen sort zugeführt werden kann, zu ertrag:

000:00:05.23|cpu time 5.23 seconds 
000:00:09.05|cpu time 9.05 seconds 
000:00:25.23|cpu time 25.23 seconds 
000:00:44.15|real time 44.15 seconds 
000:01:04.15|real time 1:04.15 
000:01:44.15|real time 1:44.15 
000:02:25.23|cpu time 2:25.23 
000:08:02.07|real time 8:02.07 
000:21:04.15|real time 21:04.15 
000:39:44.15|real time 39:44.15 
001:01:04.15|real time 1:01:04.15 
001:39:44.15|real time 1:39:44.15 
032:21:04.15|real time 32:21:04.15 
122:21:04.15|real time 122:21:04.15 

Und aus dem der Sortierspalt mit ‚sed‘ abgezogen werden ergeben:

cpu time 5.23 seconds 
cpu time 9.05 seconds 
cpu time 25.23 seconds 
real time 44.15 seconds 
real time 1:04.15 
real time 1:44.15 
cpu time 2:25.23 
real time 8:02.07 
real time 21:04.15 
real time 39:44.15 
real time 1:01:04.15 
real time 1:39:44.15 
real time 32:21:04.15 
real time 122:21:04.15 

, dass ‚xx.data‘ gegeben, so, die Datendatei ist und der Perl-Skript xx.pl ist, ist die Befehlszeile :

perl xx.pl xx.data | sort | sed 's/^[^|]*|//' 
+0

Ja, ich muss den Kontext der Linie beibehalten. Du liest meine Gedanken. Vielen Dank. –

0

Wenn Sie Ihr Skript zeigen, es würde helfen, aber ich vermute, dass die while Schleife nicht erforderlich ist. Probieren Sie etwas wie folgt aus:

grep -E '^(cpu|real) time' | sed 's/:/00/' | sort -n 
Verwandte Themen