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
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
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.
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)
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique