Grep de pattern entre 2 fichiers

Résolu/Fermé
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 - Modifié le 13 avril 2018 à 14:48
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 - 16 avril 2018 à 00:31
Bonjour, je me permet de demander votre aide car malgré une recherche de 3 jours sur internet, je ne trouve toujours pas de solution ....

Je possède deux fichier :

hits2.txt :

ADIR000331
ADIR000332
ADIR000480
ADIR000481
ADIR000482
ADIR000483
ADIR000492
ADIR001280
ADIR001281
ADIR001282
ADIR001283
ADIR001479
ADIR001557
ADIR001581
ADIR002106
ADIR002107
ADIR002758
ADIR002862
ADIR003031
ADIR003625
ADIR003626
ADIR003934
ADIR004830
ADIR005334
ADIR005654
ADIR005701
ADIR006099
ADIR006388
ADIR007449
ADIR008216
ADIR008218
ADIR008219
ADIR008221
ADIR008222
ADIR008366
ADIR008368
ADIR008406
ADIR008407
ADIR008409
ADIR008821
ADIR008822
ADIR008823
ADIR008824
ADIR008825
ADIR008984
ADIR010042
ADIR010308
ADIR010652
ADIR011150
ADIR011325

et ortho.txt :

ADIR000331-PA REF_AAEL001174
ADIR000332-PA REF_AAEL006385
ADIR000480-PA REF_AAEL002596
ADIR000481-PA REF_AAEL002626
ADIR000482-PA REF_AAEL002606
ADIR000483-PA REF_AAEL002598
ADIR000492-PA REF_AAEL011416
ADIR001581-PA REF_AAEL012377
ADIR002106-PA REF_AAEL006108
ADIR002107-PA REF_AAEL006109
ADIR002758-PA REF_AAEL000035
ADIR002862-PA REF_AAEL008013
ADIR003031-PA REF_AAEL006176
ADIR003934-PA REF_AAEL005772
ADIR004830-PA REF_AAEL006454
ADIR005701-PA REF_AAEL011730
ADIR006099-PA REF_AAEL009597
ADIR008216-PA REF_AAEL011494
ADIR008218-PA REF_AAEL011499
ADIR008219-PA REF_AAEL015567
ADIR008222-PA REF_AAEL011487
ADIR008366-PA REF_AAEL000051
ADIR008368-PA REF_AAEL000073
ADIR008406-PA REF_AAEL015499
ADIR008407-PA REF_AAEL008011
ADIR008409-PA REF_AAEL009449
ADIR008821-PA REF_AAEL000139
ADIR008823-PA REF_AAEL004729
ADIR008824-PA REF_AAEL004730
ADIR010042-PA REF_AAEL007603
ADIR010308-PA REF_AAEL015313
ADIR010652-PA REF_AAEL000071
ADIR011150-PA REF_AAEL001826

Mon but est de créer un script python qui prend chaque ligne (mot) du fichier hits2.txt, qu'il regarde si ce mot est présent dans ortho.txt et qu'il affiche AAEL... soit la deuxième colonne sinon il affiche NA. Il faudrait donc réaliser une boucle pour que chaque mots de hits2.txt soit recherché dans ortho.txt et afficher le résultat voulu.

Voici mon code :
#!/usr/bin/
# -*- coding: utf-8 -*-
 
import re
import sys
 
 
f = open("hits2.txt", "r")
 
#hit=fichier.read().split("/n")
 
fichier=f.read()
 
chaine = fichier.split("\n")
 
print chaine
 
fichier = open("ortho.txt","r")
 
f=fichier.read()
tot=f
 
print tot
 
 
for mot in chaine :
    if re.search(mot, tot):
        for ligne in tot :
            s2 = ligne.split('REF_')[1]
            print s2       
    else :
        print "NA"
 
fichier.close()




Les fichiers sont bien lus par le programme car les prints renvoie le contenu de chaque fichiers. Cependant, le programme n'arrive pas à aller plus loin.

Vous en remerciant par avance




A voir également:

1 réponse

Bonsoir.

Python possède une structure de données très pratique permettant de faire cela facilement, les dictionnaires.

L'idée est d'éclater les lignes du fichier
ortho.txt
par la valeur
 -PA REF_
.
La 1ère valeur représentera la clé du dictionnaire, la 2ème, sa valeur.

Cela fait, il sera de cette façon extrêmement simple de regarder si les valeurs du fichier
hits2.txt
sont des clés du dictionnaire.

Et pour être certain de ne pas être ennuyé par d'éventuels caractères blancs, on effectue un
str.strip
sur les valeurs.

Ce qui donne :

#!/usr/bin/ # -*- coding: utf-8 -*-
from __future__ import with_statement, print_function

with open("hits2.txt") as fhits, open("ortho.txt") as fortho:
    hits = [hit.strip() for hit in fhits.readlines()]
    ortho = dict()
    for line in fortho.readlines():
        k, v = line.split('-PA REF_')
        ortho[k.strip()] = v.strip()

    for hit in hits:
        print(ortho.get(hit, 'NA'))


Au passage, si tu n'as pas de raisons valables d'utiliser python2, il serait mieux d'utiliser python3 (les 2 premières lignes de ce bout de code seront alors à supprimer car inutiles en python3).
0
irishupk Messages postés 25 Date d'inscription vendredi 13 avril 2018 Statut Membre Dernière intervention 29 juin 2020 1
Modifié le 16 avril 2018 à 00:58
Bonjour !! Je vous suis infiniment reconnaissante !!! Votre code marche parfaitement et vos explication sont claires et m'ont permise de comprendre pourquoi vous utilisiez ces fonctions ! Je vous en remercie de l'aide apportée pour une débutante comme moi ! Les cours sur ce language n'arrivent que dans quelque mois
1