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 des lignes d'un fichier selon la valeur d'un substr d'une colonne


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Supprimer des lignes d'un fichier selon la valeur d'un substr d'une colonne
    j'ai aussi une autre question dans le même contexte: Je voudrais supprimer des lignes selon la valeur de la première colonne,

    par exemple:

    read jd (jour début) supposon que $jd=15
    read jf (jour fin) // // $jf=18

    on a le fichier suivant en INPUT:

    14/01/2012;a;b;c;d
    15/01/2012;a;b;c;d
    16/01/2012;a;b;c;d
    17/01/2012;a;b;c;d
    18/01/2012;a;b;c;d
    19/01/2012;a;b;c;d
    20//01/2012;a;b;c;d

    je voudrais avoir en OUTPUT:

    15/01/2012;a;b;c;d
    16/01/2012;a;b;c;d
    17/01/2012;a;b;c;d
    18/01/2012;a;b;c;d

    toutes les autres lignes seront supprimées. Merci de me répondre, je vous serai reconnaissant

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    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
    $ cat plop 
    14/01/2012;a;b;c;d
    15/01/2012;a;b;c;d
    16/01/2012;a;b;c;d
    17/01/2012;a;b;c;d
    18/01/2012;a;b;c;d
    19/01/2012;a;b;c;d
    20//01/2012;a;b;c;d
     
    $ sed -n '/^15/,/^18/p' plop 
    15/01/2012;a;b;c;d
    16/01/2012;a;b;c;d
    17/01/2012;a;b;c;d
    18/01/2012;a;b;c;d
     
    $

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    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
    $ cat plop 
    14/01/2012;a;b;c;d
    15/01/2012;a;b;c;d
    16/01/2012;a;b;c;d
    17/01/2012;a;b;c;d
    18/01/2012;a;b;c;d
    19/01/2012;a;b;c;d
    20//01/2012;a;b;c;d
     
    $ sed -n '/^15/,/^18/p' plop 
    15/01/2012;a;b;c;d
    16/01/2012;a;b;c;d
    17/01/2012;a;b;c;d
    18/01/2012;a;b;c;d
     
    $
    Merci bcp mais j'ai un petit souci, la date est affichée en anglais 2012-01-15
    le nombre en question se trouve en dernière position au lieu d'être au début de la ligne...Merci de m'aider!!!

  4. #4
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    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
    $ cat plop
    2012-01-14;a;b;c;d
    2012-01-15;a;b;c;d
    2012-01-16;a;b;c;d
    2012-01-17;a;b;c;d
    2012-01-18;a;b;c;d
    2012-01-19;a;b;c;d
    2012-01-20;a;b;c;d
     
    $ sed -n '/15;/,/18;/p' plop 
    2012-01-15;a;b;c;d
    2012-01-16;a;b;c;d
    2012-01-17;a;b;c;d
    2012-01-18;a;b;c;d
     
    $

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    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
    $ cat plop
    2012-01-14;a;b;c;d
    2012-01-15;a;b;c;d
    2012-01-16;a;b;c;d
    2012-01-17;a;b;c;d
    2012-01-18;a;b;c;d
    2012-01-19;a;b;c;d
    2012-01-20;a;b;c;d
     
    $ sed -n '/15;/,/18;/p' plop 
    2012-01-15;a;b;c;d
    2012-01-16;a;b;c;d
    2012-01-17;a;b;c;d
    2012-01-18;a;b;c;d
     
    $
    Merci pour cette solution mais j'ai pas exactement ";" après le jour j'ai plutôt une heure (2012-01-15 10:09:12), et les jours précisés dans le sed peuvent ne pas exister dans le fichier genre le 15 et le 18 peuvent ne pas exister dans le fichier....

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Tu as le principe, à toi d'adapter en fonction de tes besoins.

    Par contre si les jours n'existent pas, ben t'auras rien en sortie

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Exactement :s il me sort rien

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    y a t-il une autre solution ?

  9. #9
    Membre habitué Avatar de Levi59
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 58
    Points : 148
    Points
    148
    Par défaut
    un petit exemple en bash qui devrait fonctionner (à adapter selon tes besoins):
    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
    #!/bin/bash
     
    search() { 
        i=$1
        j=$2
        until [[ -n $(grep $i plop) ]]
        do 
            ((i++))
            (($i>$j)) && {
                echo "pas de correspondance"
                exit 0
            }
        done
     
        (($j==$i)) && {
            echo "une seule correspondance"
            echo $(grep $j plop)
            exit 0
        }
     
        until [[ -n $(grep $j plop) ]]
        do 
            ((j--))
            (($j==$i)) && {
                echo "une seule correspondance"
                echo $(grep $j plop)
                exit 0
            }
        done
        sed -n '/'$i';/,/'$j';/p' plop
    }
    search $1 $2
    Ce qui donne :
    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
    akira@virtualcrunchbang:~$ cat plop
    2012-01-14;a;b;c;d
    2012-01-16;a;b;c;d
    2012-01-17;a;b;c;d
    2012-01-18;a;b;c;d
    2012-01-19;a;b;c;d
    2012-01-20;a;b;c;d
    2012-01-31;a;b;c;d
    akira@virtualcrunchbang:~$ ./plop.sh 15 20
    2012-01-16;a;b;c;d
    2012-01-17;a;b;c;d
    2012-01-18;a;b;c;d
    2012-01-19;a;b;c;d
    2012-01-20;a;b;c;d
    akira@virtualcrunchbang:~$ ./plop.sh 19 25
    2012-01-19;a;b;c;d
    2012-01-20;a;b;c;d

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

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

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    while IFS="-" read y m reste; do d="${reste%%;*}"; (( d >= $1 && d <=$2 )) && echo "$y-$m-$reste"; done <plop
    je vous laisse ajouter les tests pour être sûr que $1 est inférieur à $2, qu'ils sont bien des nombres, etc.

    si le fichier est volumineux, ce code doit pouvoir être adapté très facilement en awk.

Discussions similaires

  1. Supprimer des lignes d'un fichier 1 en fonction du contenu du fichier 2
    Par Ohemeg dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 10/11/2008, 10h05
  2. Supprimer des lignes d'un fichier
    Par chreks dans le forum Fortran
    Réponses: 3
    Dernier message: 05/06/2008, 19h25
  3. problème pour supprimer des lignes d'un fichier
    Par NicoO_O dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 17/01/2008, 07h23
  4. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00
  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