Comment sortinger par hh: mm: ss.xx dans ksh dans AIX 5.3?

J’ai beaucoup de fichiers journaux comme ceci:


……
……
temps CPU 9.05 secondes
temps réel 8: 02.07
……
……
temps de processeur 2: 25.23
temps réel 1: 39: 44.15
……
……


Pour obtenir tous les temps, je passe simplement tout le temps processeur et le temps réel.
Ensuite, sortingez les fichiers de sortie grep.
J’utilise AIX 5.2, il y a un sorting par chaîne ou par numéro.
Mais, il n’y a pas de sorting par heure: minute: seconde.

Pour résoudre ce problème, je passe les lignes de sortie grep à une boucle while.
Ensuite, créez une nouvelle variable en utilisant sed ‘s /: / 00 / g’
Ce nouveau var va faire hh: mm: ss.xx devient hh00mm00ss.xx
puis sortinger par cette nouvelle variable comme numérique.

De cette façon, je peux trouver les étapes les plus longues.
Ce travail autour peut faire mais la vitesse est un peu lente.

Quelqu’un peut-il avoir une meilleure alternative?
Merci d’avance.

Alvin SIU

Dans l’article «Théorie et pratique dans la construction d’une routine de sorting de travail», JP Linderman montre que le meilleur moyen d’obtenir de bonnes performances de la commande de sort du système (la «routine de sorting» sur laquelle il travaillait) avec des clés complexes était de créer des commandes pour générer des clés qui rendent les comparaisons simples. Dans l’exemple, la commande de sorting avec la clé complexe était la suivante:

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

Le mécanisme alternatif utilisait un générateur de clé pour faciliter le sorting:

 keygen | sort | keyssortingp 

et le générateur de clé était:

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

et le ssortingpper était:

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

Pour les données de test avec lesquelles travaillait Lindeman, cela réduisait le temps écoulé d’environ 2100 secondes pour la commande de sorting élaborée à environ 600 secondes pour le awk | sort | awk awk | sort | awk Combinaison awk | sort | awk .


En adoptant cette idée ici, j’utiliserais un script Perl pour présenter les valeurs de temps disparates uniformément dans un format que le sort peut gérer sortingvialement.

Dans ce cas, vous semblez avoir une variété de formats de temps pour vous inquiéter:

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

Il n’est pas clair si vous devez conserver le contexte des lignes que vous sortingez, mais il me semble que je convertirais les temps en une forme canonique. Devez-vous prévoir des heures à trois chiffres en temps réel? Si le temps passe à 20,05 secondes, le suffixe rest-t-il? Si le temps passe à 80,05 secondes, est-ce que c’est imprimé en 1: 20.05? Je suppose que oui …

 #!/usr/bin/env perl use ssortingct; 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; } 

Compte tenu des données d’entrée:

 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 

Cela génère les données de sortie:

 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 

Qui peut être alimenté en une sort simple, pour donner:

 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 

Et à partir de laquelle la colonne de sorting peut être dénudée avec “sed” pour donner:

 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 

Donc, étant donné que le fichier de données est «xx.data» et que le script Perl est xx.pl, la ligne de commande est la suivante:

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

Si vous montrez votre script, cela aidera, mais je pense que la boucle while est inutile. Essayez quelque chose comme ça:

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