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 :

[GNU Sed] Faire un "one shot"


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut [GNU Sed] Faire un "one shot"
    Salut tout le monde

    J'ai un petit truc perso à faire, et je pense que GNU Sed, avec votre aide, pourrait m'aider à gagner en temps de traitement.

    Voilà le tableau :

    Sur une plateforme Windows, j'ai une chaine alpha qui ressemble à ceci

    "type","date"
    et une autre, bêta, qui ressemble à ce qui suit
    "date=2005-10-26", "type=file", "level=3"
    Alpha représente le format à afficher, donc ça peut tout aussi bien être

    type; none;
    le tout insensible à la casse.

    L'objectif, comme vous l'avez deviné, c'est de remplir chaque champ de la chaine alpha avec les données correspondantes trouvées dans la chaine bêta, le cas échéant, par une chaine vide si la donnée n'existe pas.

    Jusqu'à présent, ce que je fais, c'est parcourir la chaine bêta et charger ses données dans le Shell sous forme de variable et ensuite procéder au remplacement dans la chaine alpha Je pense qu'il y a moyen de faire le tout en une seule fois, en une seule passe, le fameux "one shot" ça ou ça comme vous voulez

    Idéalement, je voudrais faire ça avec GNU Sed, mais j'ai aucune piste, au pire avec GNU Awk, mais je connais pratiquement pas.

    Voilà, j'espère avoir été complet et que cette gymnastique neuronale sera un exercice plaisant.

    Merci d'avance pour vos aides

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 378
    Par défaut
    Bonjour,

    Pas tout compris, peux-tu donner un exemple de 4 ou 5 lignes de tes 2 fichiers d'entrée et le fichier de sortie en résultant ?

  3. #3
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    ah salut disedorgue, merci,

    alors, mon objectif est le suivant, j'ai cette liste par exemple
    "date=2005-10-26", "type=file", "level=1"
    "date=2005-10-27", "type=file", "level=2"
    "date=2005-10-28", "type=file", "level=3"
    et je dois formater chaque ligne.

    si le format est "type";"date";, alors en sortie je devrais avoir
    "file";"2005-10-26";
    "file";"2005-10-26";
    "file";"2005-10-26";
    Si le format est type; date alors en sortie je devrais avoir
    file; 2005-10-26
    file; 2005-10-26
    file; 2005-10-26
    Si le format est system; date alors en sortie je devrais avoir
    ; 2005-10-26
    ; 2005-10-26
    ; 2005-10-26
    Merci encore.

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    [neumann@MacBookPro ~]$ cat test.txt 
    "date=2005-10-26", "type=file", "level=1"
    "date=2005-10-27", "type=file", "level=2"
    "date=2005-10-28", "type=file", "level=3" 
    [neumann@MacBookPro ~]$ sed 's/.*date=\([0-9]*\-[0-9]*\-[0-9]*\).*type=\([a-z]*\).*/"\2";"\1"/g' test.txt 
    "file";"2005-10-26"
    "file";"2005-10-27"
    "file";"2005-10-28"
    Après on adapte légèrement en fonction du format de l'autre ligne et c'est réglé (sinon ça doit être faisable avec awk une fois)

    ?

    Idriss

  5. #5
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    salut ok.Idriss, merci

    Citation Envoyé par ok.Idriss
    Après on adapte légèrement en fonction du format de l'autre ligne et c'est réglé


    ce qu'il y a, c'est que le format c'est pas moi qui le choisi, on pourrait presque considérer qu'il est aléatoire, du coup, la commande de remplacement devrait être généré de manière dynamique, c'était la voie sur laquelle je m'étais engagé, mais je sais plus sur quel problème j'avais buté ce jour-là.

    ce qu'il y a de certain, c'est que les champs à remplacer c'est des mots qui peuvent contenir les symboles tiret du milieu et tiret bas, mais rien d'autres.

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unix~$ cat test.dat
    "token1=t11","token2=t12"
    "token1=t21","token2=t22"
    avec awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unix~$ awk -v liste=token1,token2 -f p.awk test.dat
    t11;t12;
    t21;t22;
    unix~$ awk -v liste=token1,system -f p.awk test.dat
    t11;;
    t21;;
    unix~$
    Le code awk:

    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
    BEGIN {
            max = split(liste,champs,",")
    }
     
    {
            gsub(/"/, "", $0)
    }
     
    {
            for (x = 1; x <= max; x++) {
                    deb = index($0, champs[x])
                    len = length(champs[x]) + 1
                    if (deb == 0) {
                            printf(";")
                    } else {
                            data=substr($0, deb + len, length($0))
                            len=index(data, ",")
                            if (len == 0) {
                                    printf("%s;", data)
                            } else {
                                    value=substr(data, 1, len - 1)
                                    printf("%s;", value)
                            }
                    }
        }
            print ""
    }

+ Répondre à la discussion
Cette discussion est résolue.

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