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