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 :

Supprimer les lignes précédentes d'un motif


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
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Par défaut Supprimer les lignes précédentes d'un motif
    Bonjour à tous,
    Novice en programmation linux, je voudrais réaliser une suppression multiples de lignes lorsqu'un motif est trouvé dans le fichier.
    Lorsqu'un motif défini est rencontré dans le fichier, la ligne le contenant mais également les 3 précécentes soient supprimées.

    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
    @HS13_78:1:2
    GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
    +
    CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
    @HS13_78:1:1
    ATCTTTTGCACTGTAGTGACCAAAAACTGACACTGTAACT
    +
    motifCCCFFFFFHHHHHIIJHIJHIJJJJJJJIJIFIJJHIJIJJHIJI
    ......
     
    et apres suppression obtenir:
    @HS13_78:1:2
    GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
    +
    CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
    .....
    j'ai tenté la commande sed sans réelle efficacité sur la suppression multiple.
    pour le moment j'en suis là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 'N;/motif/d' nomdufichier
    Avez vous des idées svp ? merci

  2. #2
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Une possibilité avec sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -nE ':loop; /motif/{s/([^\n]*\n){0,3}[^\n]*motif.*//; /^$/d; s/\n$//; p; b}; ${p; b}; N; b loop' fichier

  3. #3
    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
    Une autre solution avec tac et sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tac fichier | sed -n '/motif/{n;n;n;n;};p' | tac
    Ici, on lit le fichier de la dernière ligne à la première (commande tac), et donc, si on rencontre le motif avec sed, on passe au 4 prochaines lignes. et l'option -n sert juste au cas où le motif est rencontré avant la 4ème ligne du fichier.

  4. #4
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2020
    Messages : 16
    Par défaut
    Les 2 solutions marchent à la perfection. Un grand merci !

  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 Et avec grep…
    Salut,

    Une solution avec grep : grep -e "$(grep -B3 'motif' fich)" -v fich

  6. #6
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Non, ça je crois que ça ne fonctionne pas : chaque ligne de "$(grep -B3 'motif' fich)" sera considérée comme un motif à éliminer par grep -v, si bien que ça ne donnera le même résultat que les formulations précédentes que par chance.
    En particulier, dans l'exemple donné en #1, il manquera la ligne 3, car elle matche la ligne 7, comptée parmi les motifs à éliminer.
    Par ailleurs, il faudrait penser à protéger certains caractères dans "$(grep -B3 'motif' fich)", car il s'agit d'une expression régulière.

  7. #7
    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
    T'en es sûr ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat -n bar
         1	@HS13_78:1:2
         2	GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
         3	+
         4	CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
         5	@HS13_78:1:1
         6	ATCTTTTGCACTGTAGTGACCAAAAACTGACACTGTAACT
         7	+
         8	motifCCCFFFFFHHHHHIIJHIJHIJJJJJJJIJIFIJJHIJIJJHIJI
         9	......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ grep -e "$(grep -B3  'motif' bar)" -v bar
         1	@HS13_78:1:2
         2	GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
         3	+
         4	CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
         9	......
    $

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

Discussions similaires

  1. Supprimer les lignes avant le motif
    Par xduris dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 14/03/2019, 11h56
  2. [VB.NET]Comment supprimer les lignes d'un datagridView
    Par vijeo dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/09/2006, 17h54
  3. Supprimer les lignes vides d'un document Word
    Par Jerfa dans le forum VBA Word
    Réponses: 4
    Dernier message: 28/08/2006, 16h12
  4. Réponses: 2
    Dernier message: 04/05/2006, 13h10
  5. supprimer les lignes vides?
    Par VinnieMc dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 14h01

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