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

Shell et commandes GNU Discussion :

tri et selection en langage awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut tri et selection en langage awk
    Bonsoir à tous
    j'ai un souci, mon prof me demande de faire un tri de mon fichier en utilisant le langage awk
    je vois pas comment faire
    bonjour le good 1
    bonjour le morning 2
    bonjour le the 0.5
    le good 1
    le morning 0.5
    le the 2
    Là il me demande de faire le tri du fichier selon la 3eme colonne : un tri decoissant pour chaque mot de la 1ere colonne
    donc on aura
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bonjour le              morning         2
    bonjour le              good             1
    bonjour le              the               0.5
    le                          the                2 
    le                         good              1   
    le                         morning         0.5
    est ce qu'on peut faire ca avec awk?
    merci pour vos idée


    [/QUOTE]

  2. #2
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{print $3,$0}' | sort -r | awk '{for (i=2;i<NF;i++) {printf "%s ",$i}; printf "%s\n",$NF}'
    Tu peux aussi utiliser la fonction sort dans le awk, par exemple si tu n'as pas de pipe de disponible sur ton système (!), et suivre la même idée : adjoindre le champs à trier en tête de ligne, trier, puis reformater.

    Bon, j'avoue que ce n'est pas une bonne idée de faire ton exo, mais si tu veux du tout awk, il te reste encore un peu de plaisir. Au fait, tu es sûr d'avoir regardé la syntaxe de awk avant de demander.

    Sinon, apprends à faire ça en Perl (ou en Python ou en Ruby ou en ...).

  3. #3
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Il te faut utiliser les tableaux awk.
    1) lire chaque ligne de ton fichier
    2) pour chaque ligne réorganiser la ligne et mettant la colonne 3 en premier puis la colonne 2.
    3) les lignes dans un tableau.

    Appliquer un algo de tri sur le tableau (1ere colonne)

    rechercher s'il y a des doublons pour la premère colonne. Si doublons trouvé trier ces doublons sur la deuxième colonne.

    Imprimer les lignes triées

  4. #4
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Merci pour vos reponses,
    mais ca me semble un peu compliqué surtout que je suis debutante

  5. #5
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    Merci pour vos reponses,
    mais ca me semble un peu compliqué surtout que je suis debutante
    Pour débuter ton problème: tableaux et tris


    Autre solution:
    1) tu lis toutes les lignes que tu stockes dans un tableau
    2) pour chaque ligne tu calcule la longueur MAX+1 des deux colonnes
    3) tu relis les lignes depuis le tableau et tu formattes tes lignes sur des longueurs fixe pour les deux colonnes uniquement. par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bonjour le good 1 
    bonjour le morning 2
    bonjour le the 0.5
    le good 1
    le morning 0.5
    le the 2
    donnera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    good@@@@1@@bonjour le
    morning@2@@bonjour le
    the@@@@@0.5bonjour le
    1@@@@@@@@@@le good
    0.5@@@@@@@@le morning
    2@@@@@@@@@@le the
    les @ ne sont là que pour signaler les espaces.

    Il ne reste plus qu'a trier par AWK et a imprimer tes lignes après avoir découpé les colonnes et les avoir remises au bon endroit

  6. #6
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    merci,
    mais là c'est un peu different :
    en fait dans mon fichier jai 3 colonnes
    col1 col2 col3
    bonjour good morning 0.5
    bonjour good 0.7
    bonjour morning 1
    les good 1
    les morning 2
    là , faut pas faire le tri sur tout la tableau: mais on tri selon la col1
    tu vois?
    merci

  7. #7
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Un essai par tri a bulles:

    Code : 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
    BEGIN {
    	max = 0
    }
    {
    	max = max + 1
    	data[max] = $0
    }     
     
    END {
     
    	stop = 0
    	i = 1
    	found = 1
    	while (stop == 0) {
    		if (found == 1) {
    			i = 1
    			found = 0
    		}
    		if (i < max) {
    			split(data[i], token)
    			mot1 = token[1]
    			split("", token)
    			split(data[i+1], token)
    			mot2 = token[1]
    			split("", token)
    			if (mot1 > mot2) {
    				s = data[i]
    				data[i] = data[i+1]
    				data[i+1] = s
    				found = 1
    			}
    			i = i + 1
    		}
     
    		if (i >= max) {
    			if (found == 0) {
    				stop = 1
    			}
    		}
    	}	
    	for (i=1; i <= max; i++) {
    		print data[i]
    	}
    }
    Je suis pas sur a 100% du code....et en plus coder à l'arrache

  8. #8
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    C'est un exercice intéressant. Voici ce que j'ai compris du problème:

    • Le fichier d'entrée est structuré en blocs qui sont définis par un premier champ identique. Mais il reste une incertitude: Le premier champ est-il déjà trié? Je veux dire: Est-il possible d'avoir plusieurs blocs séparés ayant le même premier champ? Je suppose que non: Le champ 1 doit être déjà trié.
    • Dans chaque bloc, il faut trier suivant le troisième champ par ordre alphabétique décroissant.

    Suit le code qui correspond à la résolution du problème:

    • Chaque ligne du fichier est lue (awk) et rangée dans un tableau associatif (a[i]) dont l'indice est le troisième champ.
    • Au début de chaque nouveau bloc, le précédent est dupliqué (b[i]), trié suivant l'indice par ordre alphabétique croissant puis imprimé à l'envers.
    • Pour le dernier bloc, puisqu'il n'y a pas de nouveau bloc, il faut un traitement particulier. C'est la raison de la présence du END dans awk: Il reprend simplement le même traitement de bloc.

    Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    awk '
    {
      if ($1 == blockWord) {a[$3]=$0}
      else
      {
        for (i=asorti(a, b); i >= 1; i--) {print a[b[i]]}
        delete a
        a[$3]=$0
        blockWord=$1
      }
    }
    END {for (i=asorti(a, b); i >= 1; i--) {print a[b[i]]}}' file.in > file.out

  9. #9
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonsoir,
    merci Jmelyn pour ta reponse, mais là il m'affiche une erreur
    awk: line 13: function asorti never defined
    ùne dée?
    merci

  10. #10
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Une chose m'embête. Ta première ligne contient 4 colonnes.
    Pas que ce soit une problème en soit mais si tu tries sur la 3 colonnes, tu dois comparer des chiffres et des chaines de caractères.

    Que dit ton algorithme de comparaison dans ce cas ?

  11. #11
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Je comprends rien a son problème. Il dit:

    mais on tri selon la col1
    On arrive pas a savoir quel est le critère de tri.

    Comme dit jmeylin: Un problème bien posé est déjà résolu. .

  12. #12
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonjour à tous et un grand merci pour vos réponses
    bonjour le morning 1
    bonjour le good 2
    bonjour le the 0.5


    le the 1
    le good 0.5
    le morning 2
    PS: Pour la 1ere ligne
    Contenu de colonne 1 : bonjour le
    Contenu de colonne 2 :morning
    Contenu de colonne 3 : 1

    Là c'est un exemple de fichier texte (reellment ya pas une ligne vide entre les 2 bloc : 1 bloc c'est a dire quil ont la meme chaine de caractere dans la colonne 1.
    donc là pour chaque bloc on tri selon la 3eme colonne( ordre decroissant)
    donc on aura:
    bonjour le morning 2
    bonjour le good 1
    bonjour le the 0.5

    le the 2
    le good 1
    le morning 0.5
    J'espere que j'etais claire
    Merci

  13. #13
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Un peu plus.


    Mais comment tu traite le fichier suivant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bonjour le morning 2
    bonjour le sunny afternoon 2  ==> col1="bonjour le" col2 ="sunny afternoon" col3 ="2"
    bonjour le good 1
    bonjour le the 0.5

  14. #14
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Re,
    voila ci joint le fichier, son format
    merci
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip xwp.zip (248 octets, 125 affichages)

  15. #15
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Je n'arrive pas a comparer des nombres tels que -3.553851e-05 et 7.547198e-05 en awk.

  16. #16
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par noooop Voir le message
    Je n'arrive pas a comparer des nombres tels que -3.553851e-05 et 7.547198e-05 en awk.
    Bonjour
    et c'est où le souci?

  17. #17
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    Bonjour
    et c'est où le souci?
    Bonsoir à tous
    j'ai un souci, mon prof me demande de faire un tri de mon fichier en utilisant le langage awk
    je vois pas comment faire
    Si tu dois utiliser awk pour trier, il y a un souci

  18. #18
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonjour,
    Je comprends pas, où est le souci, et est ce qu'il ya une autre idée pour faire cela?

  19. #19
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Bonsoir
    Apres 5 jours de ma requete j'ai pas trouvé une reponse
    c'est à dire impossible de comparer desvaleurs portant le "e" de l'exponentiel c'est ca?
    yail une autre idée à part celle là?
    merci

  20. #20
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Awk n'est pas capable de comparer 2 valeurs telles que écrites dans ton fichier. Je ne suis pas un expert. D'autres ont peut être une solution. Seule possibilité, transforme en string

Discussions similaires

  1. tri par selection
    Par houdabouayed dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 27/01/2007, 14h01
  2. Problème tri tutoriel selection multiple
    Par qbihlmaier dans le forum Access
    Réponses: 24
    Dernier message: 14/03/2006, 11h24
  3. TRI ET SELECTION DE CODE ALPHANUMERIQUE
    Par janpi34 dans le forum SQL
    Réponses: 2
    Dernier message: 07/05/2004, 18h41
  4. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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