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

Linux Discussion :

sed pour supprimer des lignes dont une chaine de caractere numérique est absente d'un intervalle de valeurs


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut sed pour supprimer des lignes dont une chaine de caractere numérique est absente d'un intervalle de valeurs
    Bonjour à tous,

    Je suis tout nouveau sur ce forum, et une question existentielle me turlupine et hante mes nuits en ce moment.
    Je dois développer un script permettant de faire de faire des sélections entre deux fichiers.

    Mon problème est le suivant : Comment sélectionner avec un sed , les lignes contenant des chaines de caractères numériques appartenant à un certains intervalle de valeurs.

    ex :

    A 120000
    B 250000
    C 923687
    D 400000


    Je ne voudrais sélectionner que les lignes comprises dans l 'intervalle [120000-500000] et ce pour un grand nombre de lignes
    donc ici exclure la C.

    Merci d'avance pour vos réponses et bonne journée à vous!!!!!!




    Hors ligne

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    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 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Tu parles de "sed". Est-ce que t'est obligé d'utiliser cet outil alors qu'il y en a d'autres plus ou moins adaptés à ton besoin ?

    Le problème de sed et des autres outils standards de traitement de fichiers, c'est qu'ils considèrent le texte comme du texte. Ils ne voient pas la notion d'intervalle. Pire, entre 1, 2, et 10 ils considèreront le 10 comme allant après le 1 et avant le 2 (puisqu'au niveau de l'ascii, 1 suivi de 0 va avant 2 suivi de rien).
    Donc pour ton besoin il sera "possible" d'utiliser sed ou grep mais que dans des conditions très précises et très restreintes et l'une d'entre elles sera que tes chaines aient toujours le même nombre de caractères.
    Exemples
    sed -e "/[1-5]00000/p" fichier
    grep "[1-5]00000" fichier

    Mais ces deux exemples ne recherchent pas réellement un intervalle comme tu l'entends. Ils recherchent juste un caractère compris entre 1 et 5 (là il y a bien la notion d'intervalle mais juste limitée au caractère) puis 5 "0".

    Pour ton problème précis, personnellement je conseillerais awk. Un outil puissant et pas tellement difficile à appréhender

    Petit cours très rapide de awk: awk est un outil puissant permettant de filtrer un fichier au travers d'un algo de travail. Tout l'algo sera intégré entre un couple d'accolades {}. Chaque ligne du fichier sera filtré par l'algo (donc inutile de te préoccuper de la boucle sur les lignes, awk le fait pour toi).

    Dans cet algo, le premier mot de la ligne se nomme "$1", le second "$2" etc. $0 contient la ligne entière. NF (Number of Field) est le nombre de mots de la ligne et NR (Number of Record) est le n° de la ligne en cours de traitement.
    Une fois ces éléments intégrés, tu peux les utiliser, les tester, etc dans un algorithme comparable à celui du C (tu peux utiliser des variables à toi, des boucles for, des alternatives if, etc).

    Exemple pour ton souci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if ($2 >= 120000 && $2 <= 500000) printf("%s\n", $0)}' fichier
    Autre exemple qui montre les possibilités de awk: on recherche maintenant une plage de valeurs sur chaque mot de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{flag=0; for (i=1; i <= NF; i++) {if ($i >= 120000 && $i <= 500000) flag=1} if (flag == 1) printf("%s\n", $0)}' fichier
    Si l'algo devient trop complexe à écrire sur une ligne, tu peux l'écrire dans un fichier X (nommé généralement X.awk). Là tu t'étends dans ton écriture comme tu le sens, comme un source C. Ensuite, te suffit de dire que tu filtreras le fichier en question au travers du fichier X.awk

    Exemple: fichier X.awk correspondant à l'exemple précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {
        flag=0;
        for (i=1; i <= NF; i++)
        {
            if ($i >= 120000 && $i <= 500000)
            {
                flag=1;
                break;
            }
        }
        if (flag == 1)
           printf("%s\n", $0);
    }
    Puis tu utilises cet algo via une commande "awk -f X.awk fichier"

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Shell et Sed
    Bonjour, y a quelque chose que je n'arrive pas à faire en SHELL :

    Comment fait on pour supprimer une variable dans un fichier ?

    Je sais bien supprimer un mot, exemple :

    #supprimer le mot toto d'un fichier
    sed '/toto/d' monfichier.txt


    J'avais penser donc remplacer toto par $variable, mais non ...

  4. #4
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par castor21 Voir le message
    J'avais penser donc remplacer toto par $variable, mais non ...
    Dans une expression régulière $ signifie "fin de ligne".
    Il faut l'échapper (le remplacer par \$) pour que ça fonctionne

Discussions similaires

  1. Réponses: 10
    Dernier message: 24/02/2014, 15h22
  2. Une macro pour supprimer des lignes dans un message
    Par blade2a dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/06/2012, 01h26
  3. Une boucle pour supprimer des lignes ?
    Par eldoir dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2012, 18h43
  4. sed et boucle pour pour supprimer des lignes
    Par edouardj dans le forum Linux
    Réponses: 15
    Dernier message: 09/11/2007, 12h39
  5. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26

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