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 :

[script] Suppressions premières lignes


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut [script] Suppressions premières lignes
    Bonjour, j'ai un problème :
    Je cherche a supprimer les premieres lignes qui contiennent une chaine de caractères spécifique.
    Pour cela j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/0.000000 0.000000 0.000000 0.000000 0.000000/d' monFich >>test
    Le problème est que cette chaine de caractère existe aussi après les lignes que je veux conserver, et le script les supprimme donc aussi.

    Je sais pas si je suis clair mais je veux supprimer les lignes uniquement avant "le premier changement de valeur"

    pouvez vous m'aider ?

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Misaki43 Voir le message
    je veux supprimer les lignes uniquement avant "le premier changement de valeur"
    Je crains que ce ne soit pas clair non...

    Aurais-tu un exemple de fichier, histoire que l'on comprenne ce que tu veux supprimer ?

    Est-ce que c'est un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    0.000000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    4.435000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    // d'autres lignes
    Et dans ce cas precis, tu ne souhaites supprimer que les lignes avant le 4.435000 ... ?
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut
    oui c'est bien cela, au final je n'ai plus besoin de la réponse j'ai fait totalemnet autre chose, mais pour les autres peut être vaut mieux il une réponse quand même ?

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Misaki43 Voir le message
    Le problème est que cette chaine de caractère existe aussi après les lignes que je veux conserver, et le script les supprime donc aussi.
    Salut
    C'est normal si tu es passé par un filtre du type de type grep...

    Citation Envoyé par Misaki43 Voir le message
    oui c'est bien cela, au final je n'ai plus besoin de la réponse j'ai fait totalemnet autre chose, mais pour les autres peut être vaut mieux il une réponse quand même ?
    Mouais. Ce serait étonnant que les autres aient un truc aussi farfelu.
    Quoi qu'il en soit, la solution est assez simple: positionner un flag puis traiter chaque ligne. Chaque ligne étant à 0 avec le flag positionné est supprimée. Dès que la ligne n'est plus à 0 on change le flag. Ainsi les autres lignes même à 0 ne sont plus supprimées.

    Ce qui donne
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    exec 3<fichier
    rm -f fichier
    cat 0<&3 |while read ligne
    do
        # Petite subtilité: le flag c'est le test de sa "non-existence"
        test -z "$flag" -a "$ligne" = "0.000000 0.000000 0.000000 0.000000 0.000000" && continue
     
        flag="ok"       # Ici je le fais exister - Le prochain test sera donc faux
        echo "$ligne"
    done >fichier
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut
    ok ça marche c'est bien ça que je voulais, mais c'est quoi cat 0<&3 ?

  6. #6
    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
    Salut,

    Sinon avec "sed" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat plop 
    0.000000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    4.435000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    // d'autres lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed '/^\(0\.000000\) \1 \1 \1 \1$/d;:z;N;$!bz' plop 
    4.435000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    // d'autres lignes

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 289
    Par défaut
    Citation Envoyé par Misaki43 Voir le message
    Bonjour, j'ai un problème :
    Je cherche a supprimer les premieres lignes qui contiennent une chaine de caractères spécifique.
    Pour cela j'ai écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/0.000000 0.000000 0.000000 0.000000 0.000000/d' monFich >>test
    Le problème est que cette chaine de caractère existe aussi après les lignes que je veux conserver, et le script les supprimme donc aussi.

    Je sais pas si je suis clair mais je veux supprimer les lignes uniquement avant "le premier changement de valeur"

    pouvez vous m'aider ?
    Tu n'étais pas loin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cp monFich test
    sed -i '/0.000000 0.000000 0.000000 0.000000 0.000000/!q;d' test
    Et si tu n'as pas besoin de test, tu le fais directement sur ton fichier.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Tu n'étais pas loin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cp monFich test
    sed -i '/0.000000 0.000000 0.000000 0.000000 0.000000/!q;d' test
    Et si tu n'as pas besoin de test, tu le fais directement sur ton fichier.
    Pas testé, mais je suis étonné que cela fonctionne, car le -i retranspose en principe ce que l'on verrait sur la sortie standard. donc au final, le fichier ne contient plus qu'un ligne, celle avant de quitter.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 289
    Par défaut
    Damned! J'aurais dû tester. La réponse de Zipe31 est vraiment la meilleure.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed -n '/[1-9]/,$p' plop
    4.435000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    0.000000 0.000000 0.000000 0.000000 0.000000
    // d'autres lignes

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Misaki43 Voir le message
    ok ça marche c'est bien ça que je voulais, mais c'est quoi cat 0<&3 ?
    En faisant exec 3<fichier je crée un nouveau canal numéro 3 (le 0, 1 et 2 étant déjà utilisés par stdin, stdout et stderr) dédié à l'entrée et relié au contenu du fichier.
    En écrivant cat 0<&3 j'indique à cat qu'il doit récupérer son stdin (le 0) à partir du canal 3 (donc le fichier). C'est le seul moyen de le récupérer étant donné que le fichier a été effacé par le rm.

    Cette méthode (création canal, effacement fichier, traitement canal) permet de traiter un fichier et réécrire dedans sans passer par un fichier intermédiaire (en fait il y en a quand-même un qui est le canal lui-même mais c'est le noyau qui le gère et j'ai pas à m'en préoccuper).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Par défaut
    Ah ok et bien même si ma demande vous semble bizarre je pense que vos réponses pourront être utile aux gens
    J'ai encore beaucoup à apprendre en script de ce que je vois...

    Merci bien en tout cas

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 289
    Par défaut
    Sans oublier exec 3<&- pour fermer le canal 3 ouvert.

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

Discussions similaires

  1. [AC-2000] Suppression de premières lignes des doublons dans une requête
    Par jyoboue2008 dans le forum Access
    Réponses: 3
    Dernier message: 17/03/2014, 18h55
  2. Suppression de lignes dans un script
    Par freyr dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 30/08/2013, 00h31
  3. Script de suppression des lignes d'un fichier Excel
    Par ninsekh dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 09/10/2008, 12h44
  4. Réponses: 6
    Dernier message: 19/05/2008, 17h42

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