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 :

Parcourir les motifs dans un fichier A et les supprimer dans le fichier B


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut Parcourir les motifs dans un fichier A et les supprimer dans le fichier B
    Bonjour à vous,

    Je rencontre une petite difficulté dans un script. J'ai un premier fichier qui contient des motifs à supprimer dans un fichier B, voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do sed -e 's/'"${line}"'[ACGT]*//g' fichierB.txt > test;done < fichierA.txt
    Je n'arrive à supprimer qu'un motif parmi ma liste (la dernière).
    Quelqu'un aurait une idée et pourrait m'expliquer pourquoi ce script ne fonctionne pas pour toutes les mutations mais seulement pour une ?
    De plus, tous les motifs ne sont pas forcément présent.

    Merci pour votre aide
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    La cause du problème : à chaque boucle tu relis le fichier B, non modifié, et tu enregistres les modifications dans un nouveau fichier nommé test, qui sera écrasé à la boucle suivante.
    La solution : renommer à chaque boucle le fichier test en fichier B ou utiliser l'option -i de sed.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    carrément juste avec sed -i ca devrait fonctionner...merci (à force d'avoir la tête dessu...)

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    Désolé mais au final la solution me crée un nouveau problème pour la commande sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/'"${line}"'[ACGT]*//g'
    ici l'idée de cette commande est de supprimer les motifs ${line} suivant potentiellement à la fin, la ou les lettres A ou C ou G ou T répétées de 0 à n fois. Mais cette commande supprime tous les motifs ayant la valeur de ${line}.
    je m'explique: si une valeur de ${line} est 302 la commande va supprimer par exemple 302T. Pour ça c'est ok mais elle va aussi supprimer 16302C pour afficher à la place 16. Là c'est mois cool...

    j'ai essayé cette commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/'"${line}"'[ACGT]*\>//g'
    mais ça ne marche pas....

    Si quelqu'un a une idée? merci beaucoup

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Il faut commencer par identifier les motifs qui précédent la chaine à supprimer.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Bonjour,

    Une autre solution, tu fabriques une suite de commande sed en traitant tout le fichierA puis tu l'utilises pour le fichierB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's:.*:s/&[ACGT]*//g:' fichierA.txt | sed -f - fichierB.txt
    Par contre, il faut que tu fasses un tri de position des pattern de ton fichierA, car si tu l'utilises tel quel, tu vas rencontrer le souci suivant:
    par exemple d'abord traiter 309.1 et ensuite 309 car si tu supprimes d'abord 309, sed ne trouvera jamais 309.1

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Piotree Voir le message
    Désolé mais au final la solution me crée un nouveau problème pour la commande sed:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/'"${line}"'[ACGT]*//g'
    Attention! Le texte du code doit être entre les balises [ C O D E ] et [ / C O D E ] (sans les espaces).

    Personnellement, j'écrirais plutôt avec des guillemets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/${line}[ACGT]*//g"

    ici l'idée de cette commande est de supprimer les motifs ${line} suivant potentiellement à la fin, la ou les lettres A ou C ou G ou T répétées de 0 à n fois.
    J'imagine que tu veux dire "supprimer les motifs ${line} suivis potentiellement à la fin, par la ou les lettres A ou C ou G ou T répétées de 0 à n fois.", non?

    Mais attention! Est-ce vraiment ce que tu veux?

    Un exemple: si la valeur de ${line} est 302, alors la ligne "302999TGCA" contient bien "302[ACGT]*"!!!
    En effet, 302 est suivi de 0 occurrences de ACG ou T, vu qu'il est suivi d'un 9!!!

    De même, il va aussi trouver la ligne "888302TGCA" ou même la ligne "888302999GTCC".

    En bref, toutes les lignes contenant "302"...

    Mais cette commande supprime tous les motifs ayant la valeur de ${line}.
    Normal (voir ci-dessus).

    je m'explique: si une valeur de ${line} est 302 la commande va supprimer par exemple 302T. Pour ça c'est ok mais elle va aussi supprimer 16302C pour afficher à la place 16. Là c'est mois cool...
    Ce qui serait cool, ce serait que tu nous dises ce que tu veux!

    Tu veux supprimer toute la ligne "16302[ACGT]*" et ne pas garder "16"?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/.*${line}[ACGT]*//g"
    Tu veux conserver la ligne parce qu'elle commence par 16302 et non par 302?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/^${line}[ACGT]*//g"
    Quid des lignes "302999TGCA"?

    Si tu veux les conserver, c'est-à-dire si tu veux supprimer les lignes contenant "302", suivie d'au moins une occurrence de ACG ou T, alors il faut remplacer [ACGT]* par [ACGT][ACGT]* (ou une autre syntaxe (plus ou moins portable... suivant la version de "sed")).

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2017
    Messages : 47
    Par défaut
    Merci à tous pour vos commentaires et suggestions...

    jack-ft je veux supprimer tous les motifs du fichierA présent dans le fichierB mais pas les lignes contenant les motifs seulement les motifs. Dans le fichierA la présence des motifs sans lettres (ACGT) signifie que si on trouve un de ces motifs dans le fichierB il sera au moins suivi d'une de ces lettres ou plus.
    EX dans fichierA on a 302 et dans fichierB on a 302AC mais j'ai d'autres fichiers ou on a 302T. Je veux seulement les supprimer.

    Encore merci

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/11/2016, 20h16
  2. Supprimer n lignes d'un fichier.txt et les renvoyer dans un autre fichier
    Par supcomingenieur dans le forum Shell et commandes GNU
    Réponses: 64
    Dernier message: 30/04/2013, 13h59
  3. Réponses: 4
    Dernier message: 06/06/2011, 21h05
  4. Réponses: 5
    Dernier message: 21/02/2007, 16h12
  5. Réponses: 1
    Dernier message: 05/09/2006, 17h56

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