Partage
  • Partager sur Facebook
  • Partager sur Twitter

Filtre sur les lignes d'un fichier .txt

selon condition

    13 juin 2016 à 14:57:13

    Bonjour à tous,

    Je vous expose mon problème. J'ai un fichier .txt tab-delimiter avec plusieurs centaines de milliers de lignes qui ressemble à ceci :

    chr17    37841400    37842272    uc002hsj.3_exon_6_0_chr17_37842175_r    0    -
    chr17    37842174    37842272    uc002hsk.3_exon_5_0_chr17_37842175_r    0    -
    chr17    37844086    37844310    uc002hsj.3_exon_7_0_chr17_37844087_r    0    -
    chr17    37841002    37844531    uc002hsm.3_exon_0_0_chr17_37844393_f    0    +
    chr17    37842345    37844531    uc010cwa.3_exon_0_0_chr17_37844393_f    0    +
    chr17    37844392    37844531    uc031raa.1_exon_0_0_chr17_37844393_f    0    +
    chr17    37844948    37845053    uc002hsl.3_exon_1_0_chr17_37844949_f    0    +

    Je souhaite supprimer les doublons selon la troisième colonne, en gardant celle qui a la valeur la plus haute pour la deuxième colonne, comme ci :


    chr17    37842174    37842272    uc002hsk.3_exon_5_0_chr17_37842175_r    0    -
    chr17    37844086    37844310    uc002hsj.3_exon_7_0_chr17_37844087_r    0    -
    chr17    37844392    37844531    uc031raa.1_exon_0_0_chr17_37844393_f    0    +
    chr17    37844948    37845053    uc002hsl.3_exon_1_0_chr17_37844949_f    0    +

    Avez-vous des idées pour résoudre mon problème ?

    Merci,

    Corentin R.

    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2016 à 16:41:51

      salut,

      Avez-vous des idées pour résoudre mon problème ?

      utilise un langage qui supporte les tableaux !
      bash, awk, python, perl...

      le tableau utilisera la valeur de la troisième colonne comme indice, et sa valeur sera la ligne entière.
      si la valeur de la troisième colonne d'une ligne existe dans le tableau, il faudra "éclater" la ligne contenue comme valeur du tableau à cet indice
      pour récupérer la deuxième colonne, et pouvoir la comparer à la valeur de la deuxième colonne de la ligne lue...

      -
      Edité par dantonq 13 juin 2016 à 16:42:26

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        14 juin 2016 à 14:58:39

        Est-ce qu'il y a un petit script ou quelques lignes de python qui pourraient m'aider ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          14 juin 2016 à 18:21:58

          Salut,

          Un petit script Bash, Python, Perl ou encore Ruby ne doit pas bien être compliqué à réaliser. J'ai rapidement pondu un petit script Perl 6, en espérant qu'il puisse t'aider :

          sub MAIN(Str $orig, Str $dest) {
              my @ids;
              my $fh = open $dest, :w;
              for $orig.IO.lines -> $line {
                  my $id = ($line.split(/<:Zs> ** 4/))[2];
                  unless $id eq any @ids {
                      @ids.push($id);
                      $fh.say($line);
                  }
              }
              $fh.close();
          }

          A utiliser de la façon suivante :

          $ perl6 script.p6 file.txt dest.txt

          Dans cet exemple, file.txt correspond à ton fichier d'origine, et dest.txt ton fichier de sortie. Si tu souhaites des explications, n'hésites pas à demander. C'est fait rapidement, il y a certainement des améliorations à apporter. Bonne soirée. :)


          • Partager sur Facebook
          • Partager sur Twitter
            14 juin 2016 à 21:20:09

            Il me semble que le code précédent donne la première ligne avec un certain id.

            Un essai en python2, qui répond au cahier des charges je pense :

            # -*- coding: utf8 -*-
            
            import sys
            
            def run(inp,out):
            	resultat = {}
            	for line in inp:
            		colonnes = line.split()	# split sur les tabs ET les espaces (a parametrer)
            		if len(colonnes) != 6:	# vire les lignes vides
            			continue
            		score 	= int(colonnes[2])	# convertit en int pour trier correctement
            		cle	= colonnes[3]
            		
            		# stocke sous forme de dict : cle -> (score, ligne complete)
            		precedent = resultat.get(cle,None)
            		if precedent is None or precedent[0] < score:
            			resultat[cle] = (score, line)
            	
            	# affiche le resultat
            	for score, line in resultat.itervalues():
            		out.write(line)
            
            run(sys.stdin,sys.stdout)



            • Partager sur Facebook
            • Partager sur Twitter

            Filtre sur les lignes d'un fichier .txt

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown