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 :

Méthode pour substituer


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut Méthode pour substituer
    Bonsoir,
    J'ai un fichier dans lequel j'ai déjà filtré les enregistrements que je souhaitais via un sed -n.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fic | sed -n '/30076/p' |  sed -n '/2019/p'  > $fictmp
    Maintenant dans ce fichier $fictmp j'ai une date sur toutes les lignes de la forme YYYYMM.
    Soit je récupère ma valeur qui se trouve toujours en position 5 sur 6 caractères et je substitue celle-ci par ma varibale que j'ai passé en paramètre (mais cela est très lourd vu le nombre de lignes de mes fichiers en entrée, et en plus cela ne fonctionne pas parfaitement), soit je ne travaille plus ligne par ligne, mais sur tout le fichier $fictmp et je lui demande de modifier les valeurs de la position 5 à 10 par celle du paramètre.

    Savez vous comment faire cela ?
    Merci

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $fic | sed -n '/30076/p' |  sed -n '/2019/p'  > $fictmp
    est facilement obtimisable par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/30076|2019/p' $fic > $fictemp
    pour éviter les 3 pipes .... gagner donc beaucoup de temps.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par frp31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/30076|2019/p' $fic > $fictemp
    Il faut protéger le "pipe" avec sed à l'instar de "grep" ou utiliser l'option "-r" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sed -n '/30076\|2019/p' $fic
    ou
    sed -nr '/30076|2019/p' $fic
    De plus le pipe est ici synonyme de OU l'un OU l'autre alors que je pense que la finalité (mais je peux me tromper) est ET l'un ET l'autre, qui se traduirait par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/30076/p' $fic | sed -n '/2019/p'
    ou avec grep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep '30076'  $fic | grep '2019'
    et qu'on pourrait réduire à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/30076.*2019\|2019.*30076/p' $fic
    ou avec grep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -E '30076.*2019|2019.*30076'
    Si toutefois on recherche à la fois une ligne contenant "30076" ET "2019" dans n'importe quel ordre...

    Mais je le répète, j'ai peut être mal interprété la demande et dans ce cas là j'ai tout faux (ou presque, la protection du pipe étant exacte), et je m'en excuse par avance

  4. #4
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Merci bien.
    Ca va me permettre d'optimiser.
    Mais si j'ai d'autres "couples" de valeurs à chercher dans mes enregistrements, est-il préférable de rajouter des lignes tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -n '/30076|2020/p' $fic >> $fictemp
    sed -n '/30080|2022/p' $fic >> $fictemp
    ou dois-je faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/30076|30080|2020|2022/p' $fic >> $fictemp
    Mais pour revenir à ma question de susbtitution que me conseillez-vous ?
    Car maintenant je suis sur la ligne et non sur la totalité du fichier.
    Je veux remplacer la valeur existante de la position 5 à 10 incluse par celle amenée en paramètre yyyymm.

    Si j'ai la valeur 201012 (dans mon fichier pos 5 à 10) et qu'en paramètre j'ai mis 201105, il me faut dans tout le fichier mettre 201105.

    Merci bien.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Attention de bien relire les explications au-dessus concernant la protection du "pipe" avec "sed".

    Pour les couples il faut utiliser la syntaxe (utilisation de l'option "-r", puis des parenthèses et des pipes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -nr '/(30076.*30080|30080.*30076)|(2020.*2022|2022.*2020)/p' $fic
    Par contre tu n'as toujours pas dit si l'ordre de recherche était un critère, par exemple est-ce qu'il faut rechercher une ligne contenant le couple "30076 et 30080" dans cet ordre ou aussi comme "30080 et 30076" ?

    Pour le reste de ta demande un exemple concret serait le bienvenu merci.

  6. #6
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Pour le reste de ta demande un exemple concret serait le bienvenu merci.
    +1 on ne comprend plus rien là donne un exemple concret !

    edit: et pense à donner le message d'erreur aussi tant qu'on y est

  7. #7
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Attention de bien relire les explications au-dessus concernant la protection du "pipe" avec "sed".

    Pour les couples il faut utiliser la syntaxe (utilisation de l'option "-r", puis des parenthèses et des pipes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -nr '/(30076.*30080|30080.*30076)|(2020.*2022|2022.*2020)/p' $fic
    Par contre tu n'as toujours pas dit si l'ordre de recherche était un critère, par exemple est-ce qu'il faut rechercher une ligne contenant le couple "30076 et 30080" dans cet ordre ou aussi comme "30080 et 30076" ?

    Pour le reste de ta demande un exemple concret serait le bienvenu merci.
    bien vu

  8. #8
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    La version du système :
    SunOS devece 5.10 Generic_142900-03 sun4u sparc SUNW,Sun-Fire-15000

    Je suis en ksh.
    Pour la version de sed, je ne sais pas où trouver cela.

    Un bout du fichier :
    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
    1LCEPTFDAI20110401
    5DAI2011031010228096280229814527800200000000010310.11+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030210228096280229814859500200000000007599.73+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030810228096280264510010200200000000001282.85+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011031010228096280264510010200200000000001861.76+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030810228096280264510022600200000000005287.81+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030910228096280264510022600200000000026842.73+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030410228096280264510032300200000000003038.07+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030810228096280264510085400200000000098065.06+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011033008020226280264510091900200000000001480.66+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011031010228096280264510091900200000000011098.14+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    5DAI2011030310228096280264510098600200000000005447.84+850CREDIT DES REMISES A L'ENTREE                     072ESCOMPTE EFFETS COMMERCE
      00030CR61
    Est-ce que cela vous va ces 12 lignes ?
    Seule la ligne avec les valeurs en gras sera sélectionnée dans cet exemple.

  9. #9
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    je viens de tester cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    123 sed -n '/30076\|2019/p' $fic
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -nr '/30076|2019/p' $fic
    Mais cela ne fonctionne pas.
    1er cas : résultat NULL
    2ème cas : message d'erreur

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Quel système ?
    Quelle distrib ?
    Quelle version de "sed" ?

    On peut avoir un bout de ton fichier histoire qu'on teste de notre côté...

    Un exemple où on cherche "toto suivi de tata ou tata suivi de toto" ou "tutu suivi de tyty ou tyty suivi de tutu" :

    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
    $ cat plop
    toto et tata
    tata et toto
    toto et titi
    titi et tata
    tutu et tyty
    tyty et tutu
    tutu et titi
    titi et tyty
    
    $ sed -nr '/(to.*ta|ta.*to)|(tu.*ty|ty.*tu)/p' plop
    toto et tata
    tata et toto
    tutu et tyty
    tyty et tutu

  11. #11
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Bonjour,

    Je dois faire une modification à ce script car il se trouve que la donnée qui a été substituée, l'a été par une date format "YYYYMM". Or dans le fichier cette date est sous forme "YYYYMMDD".

    Le problème rencontré est sur la validité de la date lorsque le Jour = 31 et que le mois demandé ne fait que 29/29 ou 30 jours.

    En somme si MM in ('01','03','05','08','10','12') ==> RAS
    si MM in ('04','06','09','11') substituer 31 par 30
    si MM = '02' alors substituer 29 ou 30 ou 31 par 28

    Comme puis-ja faire cela ?
    Dois-je modifier la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nawk -v IDMOIS=${idmois} '{if (/30076.*2019/ || /10468.*224[0567]/) {print substr($0,1,4) IDMOIS substr($0,11)} }' $ficold > $fic 
    12/05/2011 16h29

  12. #12
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Est-ce qu'on aurait pas un Problème X-Y ici ?

    En gros, ça serait mieux de savoir dés le départ quel est le but final... parce que si ça se trouve, depuis le début, on te propose quelque chose alors que ça n'est pas le plus adapté !

    Donc est-ce que ton problème, ça ne serait pas que tu as des dates dans un fichier, mais que tu veux retrancher/ajouter un certain nombres de jours ou de mois à ces dates ?

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

Discussions similaires

  1. Meilleur méthode pour stocker mes données
    Par cyberlewis dans le forum Windows
    Réponses: 6
    Dernier message: 03/07/2004, 11h53
  2. Réponses: 3
    Dernier message: 24/06/2004, 11h23
  3. [C#] Une seule méthode pour plusieurs composants
    Par niPrM dans le forum Windows Forms
    Réponses: 8
    Dernier message: 01/06/2004, 14h41
  4. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 10h35
  5. Fonction/méthode pour obtenir l'IP de la machine
    Par sirex007 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 10/04/2003, 14h36

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