IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages de programmation Discussion :

Tri de requêtes avec une utilisation de Awk


Sujet :

Langages de programmation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 25
    Points : 16
    Points
    16
    Par défaut Tri de requêtes avec une utilisation de Awk
    Bonjour,
    Mon environnement est Linux et je voudrais utiliser un script shell avec du awk (c'est celui qui me semble le plus abordable pour moi) mais je suis ouvert à toute suggestion.
    J'ai une liste de requêtes Web que je voudrais trier par temps de réponse en utilisant la commande awk. Mais plus noivice que moi sur ce sujet, il n'y a pas. J'ai besoin d'un coup de main. Sauriez-vous m'aider ou me donner le chemin à suivre ?
    Mon format de fichier est le suivant :

    requête 1 item1 item 2 item3 ... temps ... item n item n+1
    requête 2 item1 item2 item3 ... temps ... item n item n+1
    requête 1 item1 item2 item3 ... temps ... item n item n+1
    ....

    Je voudrais compter les requêtes (par exemple requête 1 apparait 2 fois dans le fichier) et pour une requête donnée indiquer les intervalles de temps.
    Par exemple :
    ************* Temps en secondes ****************
    Nom - Intervalles | 0 < 0.5 | 0.5 < 5 | 5 < 10 | 10 > |
    requête 1 | 2 | 1 | 0 | 4 |
    requête 2 | 28 | 15 | 2 | 0 |
    .....

    C'est peut-être un peu ambitieux pour moi, étant donné mes connaissances en la matière, mais ca correspond aussi à un de mes besoins. Savoir le nombre de requêtes entre tel et tel temps.

    Si vous pouviez m'accorder 10mn, ce serait sympa.
    Isagarran

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    repose ta question dans le forum Linux...

    Tu auras ta réponse très vite..

    (J'utilise Linux/Unix mais ne suis pas spécialiste de awk)

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    C'est certainement possible de le faire en awk... mais moi j'ai préféré l'écrire en Python, langage disponible en natif sous Linux et qu'on peut télécharger pour Windows et que je trouve plus adapté à ce genre de traitement

    Voici le fichier témoin que j'ai utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    requête1 item1 item2 item3 0.5 itemn
    requête2 item1 item2 item3 0.5 itemn
    requête1 item1 item2 item3 2 itemn
    Donc le nom de la requête se trouve sur le premier champ, et le temps sur le 5° champ ; chaque champ étant séparé du suivant par un espace.
    On a, pour la requête 1, 2 temps compris entre 0.5 et 5 et, pour la requête 2, un temps compris entre 0.5 et 5

    Voici le code Python
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/usr/bin/env python
    # -*- coding: utf-8 *-*
     
    import decimal
     
    # Objet pour gérer une requête
    class cRequete:
    	# Création de l'objet
    	def __init__(self, temps):
    		# Initialisation des cumuls
    		self.__cumul=[]
    		for t in temps:
    			self.__cumul.append({"key" : t, "tot" : 0})
    	# __init__()
     
    	# Récupération du cumul correspondant au temps demandé
    	def __getitem__(self, temps):
    		for c in self.__cumul:
    			if c["key"] == temps:
    				return c["tot"]
    		# for
    	# __getitem__()
     
    	# Ajout d'un temps à une requête
    	def add(self, temps):
    		temps=decimal.Decimal(temps)
    		mem=None
    		for c in self.__cumul[0:-1]:
    			if temps < decimal.Decimal(c["key"])\
    				and (mem == None or decimal.Decimal(c["key"]) < decimal.Decimal(mem["key"])):
    					mem=c
    			# if
    		# for
    		if mem == None: mem=self.__cumul[-1]
    		mem["tot"]+=1
    	# add()
    # cRequete
     
    # Initialisation tableau temps (tableau modifiable à loisir selon les besoins)
    temps=("0.5", "5", "10", ">10")
     
    # Initialisation requêtes
    requete={}
     
    # Traitement du fichier
    fp=open("fichier", "r")
    for line in fp:
    	# Découpage des items sur l'espace
    	item=line.split(" ")
     
    	# Vérification requête nouvelle
    	if item[0] not in requete.keys():
    		requete[item[0]]=cRequete(temps)
     
    	# Ajout du temps à la requête en cours
    	requete[item[0]].add(item[4])
    # for
    fp.close()
     
    # Affichage des requêtes et de leurs temps
    for (k, r) in requete.items():
    	txt="%s:" % k
    	for t in temps:
    		txt+=" [%s: %d]" % (t, r[t])
    	# for
    	print txt
    # for

    Et voici le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    requête1: [0.5: 0] [5: 2] [10: 0] [>10: 0]
    requête2: [0.5: 0] [5: 1] [10: 0] [>10: 0]
    Résultat correspondant aux données du fichier initial

    PS: la prochaine fois, poste dans le topic Linux. T'auras des réponses plus rapides (suis venu dans ce forum par hasard)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [MySQL] Tri par champs avec une seule requête
    Par Yoks69 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/10/2008, 08h05
  2. Critère de requête avec une zone de liste dans un formulaire
    Par Dehez dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/06/2006, 12h49
  3. Réponses: 2
    Dernier message: 03/05/2006, 17h00
  4. [JDBC] Requête avec une date sous la forme dd/MM/yyyy
    Par sylviefrfr dans le forum JDBC
    Réponses: 6
    Dernier message: 12/11/2005, 09h35
  5. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo