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/^[^|]*|//'
Ja, ich muss den Kontext der Linie beibehalten. Du liest meine Gedanken. Vielen Dank. –