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 contenant un motif


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    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
    Points : 15
    Points
    15
    Par défaut Supprimer les lignes contenant un motif
    Bonjour,
    Je souhaite supprimer les lignes d'un fichier contenant le caractère "3" dans les colonnes 10 à 317 de mon fichier (sans que la recherche prenne en considération les colonnes 1 à 9)
    J'ai testé ce code mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v '($10;$317==3)' file.txt > file.without3.txt
    merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Qu'appelles-tu une colonne dans ton cas, puisqu'on a pas le droit d'un exemple de ligne ?
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    un fichier en colonnes, c'est un travail pour awk.

    quel le séparateur de colonnes ?

    sans pouvoir tester (pas de séparateur indiqué, pas de fichier exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{for(col=10;col<=317;col++){if(^$col~"3")next; else print}' fichier.in >fichier.out
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre à l'essai
    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
    Points : 15
    Points
    15
    Par défaut
    la formule awk indiquée ne fonctionne pas dans mon cas présent. Voici pour plus de clarté l'entete de mon fichier en pièce jointe. Les délimitateurs des colonnes sont des tabulations.
    La ligne 4 colonne 10 contient un "3" et je souhaite donc supprimer toutes les lignes contenant des 3 dans les colonnes 10 à 317.
    Merci de l'aide :-)
    Fichiers attachés Fichiers attachés

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Une version sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1b;h;s/\([^\t]*\t\)\{9\}\(\([^\t]*\t\)\{306\}[^\t]*\).*/\2/;/3/{d};g' test.txt
    PS: manque peut-être une colonne (remplacer le 306 par 307)
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    le fichier est au format Microsoft.

    la commande donnée n'est pas censée fonctionner telle quelle, mais en effet, elle est erronée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F $'\t' '{line=$0; for(col=1;col<=10;col++ )del col; if($0 !~ "3")print line}' test.txt
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Tu as compté les champs ? il y en a 317 ?
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    oui. oui.

    tout à la main, sur mes didis.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Membre à l'essai
    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
    Points : 15
    Points
    15
    Par défaut
    La formule "sed" en remplaçant le 306 par 307 fonctionne à merveille. Je vais décoder cette solution pour mieux comprendre comment elle marche.
    La formule "awk" prend également en considération la 1ere colonne et donc supprime des lignes que je souhaite conserver.
    Merci pour vos aides respectives.
    Bonne journée

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Techniquement sur le même principe que le 2ème awk:

    1b => ligne 1 , on va à la fin du sed (en gros,c'est un next)
    h => copie la ligne dans le buffer holder
    s/.....// => grosse regexp qui ne conserve de la ligne que ce que l'on veut tester
    /3/{d} => si on trouve un 3 on delete le buffer courant et next (d'ailleurs, ici, les {} ne servent à rien)
    g => on copie le buffer holder dans le buffer courant

    Et par défaut, à chaque cycle, sed affiche son buffer courant
    Cordialement.

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pourquoi ne pas faire simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -Exv $'([^\t]+\t){9}.*3.*' text.txt
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -E '/^([^\t]+\t){9}.*3/d' text.txt
    ?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    parce que des fois, on réfléchit mal

    Et aussi, parce la demande porte sur les champs 10 à 317 donc avec un potentiel de nombre de champs supérieur à 317.
    Cordialement.

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    Citation Envoyé par Platon
    Le bien, c'est l'un.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'\t' '{for (i=10;i<=317;i++) if ($i==3) next;} 1'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    contenant le caractère "3" dans les colonnes 10 à 317

    Veut pas dire que la valeur du champs est égal à 3...
    Cordialement.

  15. #15
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    C'est l'interprétation de N_BaH. Mais je ne suis pas sûr. Non seulement par le code du premier posteur; mais aussi pour la différence entre "une colonne contient 3" et "3 est dans une des colonnes entre 10 et 317". Dans la deuxième formulation, le 3 est plus un tout.

    Mais je ne souhaite pas polémiquer, car on va faire des raisonnements comme "J'ai 20 ans. Ben, oui, si j'en ai 40, j'en ai au moins 20 ....".
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 721
    Points
    12 721
    Par défaut
    Et oui, comme d'habitude, les specs ne sont pas précises...
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Citation Envoyé par adrientdl13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v '($10;$317==3)'
    le code étant erroné, je n'ai considéré que sa description.
    Citation Envoyé par adrientdl13
    supprimer les lignes d'un fichier contenant le caractère "3" dans les colonnes [...]
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    parce que des fois, on réfléchit mal

    Et aussi, parce la demande porte sur les champs 10 à 317 donc avec un potentiel de nombre de champs supérieur à 317.
    Effectivement je ne m'étais pas trop posé la question, j'ai quand même pris, au début, le fichier de démo pour compter les colonnes (317 à chaque ligne), puis j'ai mis cette éventualité de coté (alors que rien ne l'empêche à priori, ce n'est qu'un extrait).
    Idem d'ailleurs pour l'ambiguïté dans la formulation (une colonne contenant un 3 ou une colonne égale à 3), j'ai pris le premier sens qui me passait par la tête et roule ma poule.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. Supprimer les lignes contenant que des 0
    Par Paul Pit dans le forum MATLAB
    Réponses: 2
    Dernier message: 21/05/2014, 14h43
  2. Supprimer la ligne contenant le motif + la ligne qui la suit
    Par sab113 dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 17/04/2012, 10h03
  3. Supprimer les lignes contenants un mot specifique en batch file
    Par stpaul04 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 12/02/2011, 14h11
  4. [XL-2007] Macro, pour supprimer les lignes contenant « #REF! »
    Par LittleDaddy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/01/2011, 00h05

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