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 :

[awk/sed] Suppression de ligne en fonction d'un champ ET d'un champ sur la ligne précédente


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Exploitant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Exploitant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut [awk/sed] Suppression de ligne en fonction d'un champ ET d'un champ sur la ligne précédente
    Bonjour,

    Je vous met à contribution car je n'ai pu trouver satisfaction sur Google.
    Je souhaite supprimer les lignes débutant par le terme "equipe" si et seulement si la ligne précédente ne débute par le terme "team" ou "nba".
    J'aurais ceci en entré:

    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
    nba.1
    chicago
    equipe chicago
    nba.2
    equipe San Antonio
    nba.8
    New-york
    equipe New-york
    nba.3
    houston
    equipe houston
    team usa
    equipe Miami
    nba.7
    Atlanta
    equipe Atlanta
    Je souhaite obtenir ceci en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    nba.1
    chicago
    nba.2
    equipe San Antonio
    nba.8
    New-york
    nba.3
    houston
    team usa
    equipe Miami
    nba.7
    Atlanta
    Je souhaite utiliser sed ou awk pour ce faire.
    Merci d'avance pour vos retours.
    Gear5.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    Bonjour,

    Je souhaite supprimer les lignes débutant par le terme "equipe" si et seulement si la ligne précédente ne débute par le terme "team" ou "nba".
    il faut penser à l'envers : un programme traite un fichier ligne par ligne, et ne peut pas (si c'est possible, pas facilement...) revenir sur les lignes lues, mais il peut les mémoriser.
    donc,
    si une ligne ne commence pas par "team" ou "nba"
    alors si la ligne suivante commence par "équipe"
    ...
    finsi
    finsi

    et ça se fera avec sed.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Exploitant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Exploitant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut
    Merci pour la réponse, j'essaie ça et fait un retour rapide.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Exploitant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Exploitant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut
    Re-bonjour,

    alors si la ligne suivante commence par "équipe"
    J'ai à nouveau sondé le net, mais je ne vois pas comment tester, car je n'arrive pas à la récupérer, la ligne suivante.

    Cdt.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/^\(team\|nba\)/!{N;/\nequipe/s/\n.*//}' fichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Exploitant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Exploitant

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Par défaut
    N_Bah, ça fonctionne à merveille.
    Peux-tu me dire si je peux apprendre à aussi bien gérer sed uniquement avec ce site ou aurais-tu des (ou d'autres) adresses à me fournir?
    Merci d'avance.
    Bonne journée.
    Cdt.

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par Gear5 Voir le message
    je ne vois pas comment tester, car je n'arrive pas à la récupérer, la ligne suivante.
    comme dit plus haut il faut tourner le problème dans un autre sens, d'ailleurs la formulation initiale n'était finalement pas mauvaise, supprimer les lignes débutant par le terme "equipe" si et seulement si la ligne précédente ne débute par le terme "team" ou "nba", ce qui revient à dire aussi afficher toutes les lignes qui ne remplissent pas cette condition

    en clair, à chaque ligne traitée, j'ai accès à la ligne actuelle, et aussi à la ligne précédente que j'ai mémorisé au tour d'avant
    si la ligne courante commence par "equipe" et que la ligne précédente commençait par "nba" ou "team" alors je ne fais rien, sinon (si ce n'est pas le cas) j'affiche la ligne

    avec awk pour mémoriser la ligne précédente on peut simplement faire un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ awk '{printf ("ligne precedente: %-30s ligne actuelle: %s\n", prec, $0); prec=$0}' fichier
    ligne precedente:                                ligne actuelle: nba.1
    ligne precedente: nba.1                          ligne actuelle: chicago
    ligne precedente: chicago                        ligne actuelle: equipe chicago
    ligne precedente: equipe chicago                 ligne actuelle: nba.2
    (...)
    maintenant qu'on dispose de la ligne précédente, reste plus qu'à matcher la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ awk '$0 ~ /^equipe/ && prec !~ /^(team|nba)/ {printf ("condition remplie, devrait etre supprimee : \"%s\" (ligne precedente : \"%s\")\n", $0, prec)} {prec=$0}' fichier
    condition remplie, devrait etre supprimee : "equipe chicago" (ligne precedente : "chicago")
    condition remplie, devrait etre supprimee : "equipe New-york" (ligne precedente : "New-york")
    condition remplie, devrait etre supprimee : "equipe houston" (ligne precedente : "houston")
    condition remplie, devrait etre supprimee : "equipe Atlanta" (ligne precedente : "Atlanta")
    maintenant qu'on arrive à isoler les lignes à supprimer il suffit de faire l'inverse, afficher les lignes qui remplissent la condition inversée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ awk '!($0 ~ /^equipe/ && prec !~ /^(team|nba)/) {print} {prec=$0}' fichier
    nba.1
    chicago
    nba.2
    equipe San Antonio
    nba.8
    New-york
    nba.3
    houston
    team usa
    equipe Miami
    nba.7
    Atlanta

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

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

    J'aime bien la version de N_BaH mais elle ne fonctionnera pas dans le cas suivant (la ligne équipe devrait être supprimée et elle ne le sera jamais car le 'N' a consommé la première ligne de la paire de lignes):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    blabla
    bloblo
    equipe saucisses
    Je propose donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ tac fichier.txt |sed ':z;/^equipe/N;/\nteam\|\nnba/!s/.*\n//;t z;'|tac
    nba.1
    chicago
    nba.2
    equipe San Antonio
    nba.8
    New-york
    nba.3
    houston
    team usa
    equipe Miami
    nba.7
    Atlanta
    Pourquoi la boucle ? Pour la même objection que ci-dessus: pour ne pas snober le cas suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nba.7
    Atlanta
    equipe Atlanta
    equipe Atlanta

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

Discussions similaires

  1. [XL-2010] Ecrire sur une ligne en fonction d'une autre
    Par backx3 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/02/2015, 14h33
  2. [XL-2007] copier coller une cellule sur une ligne en fonction d'une valeur
    Par armina1978 dans le forum Excel
    Réponses: 3
    Dernier message: 17/11/2014, 09h43
  3. Réponses: 6
    Dernier message: 24/05/2012, 11h53
  4. Réponses: 11
    Dernier message: 13/12/2011, 17h41
  5. [sed]Suppression de saut de ligne dans certains cas
    Par Anthony.Desvernois dans le forum Linux
    Réponses: 11
    Dernier message: 09/07/2007, 11h33

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