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

Langage Perl Discussion :

Supprimer des lignes spécifiques d'un fichier


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Supprimer des lignes spécifiques d'un fichier
    Bien le bonjour !

    Voilà, j'aurai besoin de votre aide pour un petit script perl (ou bash ?) de dépannage.

    En effet, mon maître de stage a quelques énormes retours de Blastx en fichiers textes d'une taille minimale de 1.2Go... Plutôt énormes donc, et inouvrables.

    Pour alléger tout ça, on m'a demandé de supprimer les informations "inutiles" des retours ( les références notamment).
    Pour compléter, on m'a aussi demandé de supprimer des résultats où aucun hit n'est trouvé, tout en enregistrant dans un nouveau fichier la liste des query concernées. Cet aspect là ne me parait pas bien compliqué, je me débrouillerai.


    Donc, pour visualiser, voici ce que je dois obtenir après traitement (parties en rouge à supprimer, en bleu à sauvegarder dans autre sortie, en vert fichier en lecture modifié) [ici c'est un tblastn, mais ça ne change rien au principe] :

    TBLASTN 2.2.21 [Jun-14-2009]


    Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
    Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
    "Gapped BLAST and PSI-BLAST: a new generation of protein database search
    programs", Nucleic Acids Res. 25:3389-3402.

    Query= chromo1_4117
    (158 letters)

    Database: /home/noirham/Programmation/Stage/cnrs/002
    2 sequences; 103,754 total letters

    Searching..................................................done

    ***** No hits found ******


    TBLASTN 2.2.21 [Jun-14-2009]


    Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,
    Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997),
    "Gapped BLAST and PSI-BLAST: a new generation of protein database search
    programs", Nucleic Acids Res. 25:3389-3402.



    Query= chromo1_4391
    (231 letters)


    Database: /home/noirham/Programmation/Stage/cnrs/002
    2 sequences; 103,754 total letters

    Searching..................................................done



    Score E
    Sequences producing significant alignments: (bits) Value

    0002 20 7.8

    >0002
    Length = 58817

    Score = 19.6 bits (52), Expect = 7.8, Method: Compositional matrix adjust.
    Identities = 9/28 (32%), Positives = 15/28 (53%)
    Frame = -1

    Query: 152 CPLLPVREPCCVCLKSLRLLLFRSPPPF 179
    C L + P C C+ S+ + ++ SP F
    Sbjct: 18161 CKL*RIDSPNCFCISSVVIPIYVSPINF 18078
    Idéalement, je voudrais éviter de recréer un nouveau fichier, étant donné la taille du fichier initial. Mais je n'arrive pas à trouver comment supprimer des lignes dans un fichier en lecture. Voici l'état de mon code actuellement :

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
     
     
     my $name_file = ""; my $outfile_a = ""; my $outfile_b = ""; #my $parser = ""; my $result = "";
     
    	($name_file)=$ARGV[0]=~/([\w\-_]+\.)txt/ ;
    	$outfile_a = $name_file."no_hit";
    	#$outfile_b = $name_file."clean.txt";
     
     
    	open(IN, "+>$ARGV[0]")|| die "cannot open $ARGV[0]";			#ouvre le fichier passé en arguments
    	open(OUT, ">$outfile_a")|| die "cannot create $outfile_a";		#crée le fichier de sortie no_hit
    	#open(OUT, ">$outfile_b")|| die "cannot create $outfile_b";		#crée le fichier de sortie no_hit
     
     
    	while (<IN>)	{
     
    		s/Reference: Altschul, Stephen F., Thomas L. Madden, Alejandro A. Schaffer,//; #Pour remplacer la 1ere ligne de référence par une expression vide
     
    	}
     
    	close(IN);
    	close(OUT);
    Ce script a pour merveilleux effet de me supprimer l'intégralité du fichier...
    Ce qui me bloque pour l'instant, c'est simplement le fait que je ne connaisse pas d'astuce pour supprimer une ligne... Le reste n'est qu'une question d'expression.


    Je vous remercie d'avance pour votre aide précieuse.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    Salut,

    Le plus simple c'est de parcourir ton fichier simplement et de le réécrire, ligne par ligne, à la volée dans un autre fichier en omettant de réécrire ce que tu ne veux pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while (my $ligne = <FILEIN>)
    {
        if ($ligne !~ m/je veux pas ca/ )
        {
            print OUT $ligne;
        }
    }
    une autre solution consisterai à utiliser le module: Tie::File
    http://search.cpan.org/~mjd/Tie-File...ib/Tie/File.pm

    Qui ouvre une fichier (sans le stocker en mémoire!) et donne accès à chaque ligne via un tableau. modifier le tableau (supprimer un élément) modifie directement le fichier.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci ! La première solution m'a l'air pas mal ! Je teste ça dessuite.

    Par contre, (google est mon ami je vérifie en même temps, mais bon, au cas où), dans le m/ /, je mets l'expression entière, ou juste un mot qui apparaît dans les lignes que je ne veux pas ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 221
    Points : 207
    Points
    207
    Par défaut
    "m/ /" c'est pour matcher une expression régulière.

    ton expression régulière peut être tout ce que tu veux: la ligne entière dans son intégralité, juste un mot, ou une "vrai" REGEX

  5. #5
    Membre à l'essai
    Femme Profil pro
    Etudiante
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup ! C'est parfait.

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

Discussions similaires

  1. Supprimer des lignes vides dans un fichier
    Par Cj_Dal dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 09/07/2013, 20h58
  2. Réponses: 4
    Dernier message: 26/07/2007, 11h35
  3. Réponses: 3
    Dernier message: 21/07/2006, 13h22
  4. Supprimer qques lignes spécifiques d'un fichier
    Par Krispy dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2006, 13h52
  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