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

  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 : 42
    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 424
    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 424
    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 : 42
    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	......
    $

  8. #8
    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 : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Eh bien oui :
    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 -n fich
         1	@HS13_78:1:2
         2	GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
         3	+
         4	CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
         5	@HS13_78:1:1
         6	ATCTTTTGCACTGTAGTGACCAAAAACTGACACTGTAACT
         7	+
         8	motifCCCFFFFFHHHHHIIJHIJHIJJJJJJJIJIFIJJHIJIJJHIJI
         9	......
    $ grep -e "$(grep -B3 'motif' fich)" -v fich
    @HS13_78:1:2
    GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
    CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
    ......
    Par ailleurs, si tu as par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat -n fich1
         1	a
         2	b
         3	c
         4	d
         5	.*
         6	motif
         7	e
         8	f
         9	g
    alors tu auras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -e "$(grep -B3 'motif' fich1)" -v fich1
    $
    car la ligne 5 sera prise par grep -v au sens d'une expression régulière.
    Donc j'avoue que je ne sais pas trop comment on peut avoir des résultats différents.
    Peut-être une question de version de grep ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -V
    grep (GNU grep) 3.4

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 305
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk '{cur++;stock[cur]=$0;} /motif/{cur=cur-(1+3);} END{for (i=1;i<=cur;i++) print stock[i];}' fichier.txt
    (1+3) signifiant 1 ligne de motif et 3 lignes précédentes.

  10. #10
    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 : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    À condition que motif ne soit pas rencontré dans les trois première lignes du fichier.

  11. #11
    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
    Citation Envoyé par balkany Voir le message
    Par ailleurs, si tu as par exemple :
    [...]
    car la ligne 5 sera prise par grep -v au sens d'une expression régulière.
    Donc j'avoue que je ne sais pas trop comment on peut avoir des résultats différents.
    Peut-être une question de version de grep ?
    J'ai pris par habitude de répondre aux questions avec les exemples fournis. Si le fichier original diffère et comprend des sources potentielles de perturbations sur la solution donnée, ce n'est pas mon problème.
    Y'a longtemps que j'ai arrêté de me prendre la tête avec toutes les options possibles, sauf si je bosse pour moi… et encore

    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ grep -V
    grep (GNU grep) 3.1

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    Pour la méthode via grep de zipe31, on peut la modifier en remplaçant l'option -e du premier grep par -F et là, cela fonctionne avec les autres exemple donnés.

  13. #13
    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 : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Pas chez moi :
    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
    $ cat -n fich
         1	@HS13_78:1:2
         2	GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
         3	+
         4	CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
         5	@HS13_78:1:1
         6	ATCTTTTGCACTGTAGTGACCAAAAACTGACACTGTAACT
         7	+
         8	motifCCCFFFFFHHHHHIIJHIJHIJJJJJJJIJIFIJJHIJIJJHIJI
         9	......
    $
    $ grep -V
    grep (GNU grep) 3.1
    Copyright © 2017 Free Software Foundation, Inc.
    …
    $ 
    $ grep -F "$(grep -B3 'motif' fich)" -v fich
    @HS13_78:1:2
    GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
    CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
    ......
    $ 
    $ grep -V
    grep (GNU grep) 2.25
    Copyright © 2016 Free Software Foundation, Inc.
    …
    $ 
    $ grep -F "$(grep -B3 'motif' fich)" -v fich
    @HS13_78:1:2
    GAAATCGAGCGGCTAAAAAATCGTTGAGAGAATCGTTTT
    CCCFFFFFHHHGHJJJJJJJJJJHIJJIIJJJIJJFHJJIJJJI@GHEI
    ......
    $

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    Tu as raison, ça ne fonctionne pas non plus chez zipe31, car en fait son exemple est fait avec des lignes numérotées.
    Sa solution supprime les lignes en doublons qui appartiennent au motif -B3

  15. #15
    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 : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Eh oui, au prix d'une incohérence entre cat -n et grep en #7

+ 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, 12h56
  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, 18h54
  3. Supprimer les lignes vides d'un document Word
    Par Jerfa dans le forum VBA Word
    Réponses: 4
    Dernier message: 28/08/2006, 17h12
  4. Réponses: 2
    Dernier message: 04/05/2006, 14h10
  5. supprimer les lignes vides?
    Par VinnieMc dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 15h01

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