2013-04-29 3 views
4

Disclaimer: Je suis nouveau à la programmation et les scripts en général donc s'il vous plaît excuser l'absence de termes techniquesDiff et l'intersection des rapports entre les deux fichiers texte

j'ai donc deux ensembles de données de fichiers texte qui contiennent des noms énumérés:

First File | Second File 
bob  | bob 
mark  | mark 
larry  | bruce 
tom  | tom 

Je voudrais lancer un script (python pref) qui affiche les lignes d'intersection dans un fichier texte et les différentes lignes dans un autre fichier texte, ex:

matches.txt:

bob 
mark 
tom 

differences.txt:

bruce 

Comment pourrais-je accomplir cela avec Python? Ou avec une ligne de commande Unix, si c'est assez facile?

+2

utilisation 'sets' et fichier standard io ... avec un' string.split' là-dedans pour faire bonne mesure :) ... ou ce que vous avez essayé et où êtes-vous coincé? –

+0

La commande Unix 'diff' n'est-elle pas assez bonne? – user1613254

+0

Je soupçonne que la commande n'a pas d'importance si probablement pas ... –

Répondre

4
words1 = set(open("some1.txt").read().split()) 
words2 = set(open("some2.txt").read().split()) 

duplicates = words1.intersection(words2) 
uniques = words1.difference(words2).union(words2.difference(words1)) 

print "Duplicates(%d):%s"%(len(duplicates),duplicates) 
print "\nUniques(%d):%s"%(len(uniques),uniques) 

quelque chose comme ça au moins

+0

hey j'avais une question, si le fichier est trop gros, tout le contenu sera stocké dans l'ensemble, est-il un moyen efficace de le faire pour les gros fichiers? – Ja8zyjits

9

shell Unix Solution-:

# duplicate lines 
sort text1.txt text2.txt | uniq -d 

# unique lines 
sort text1.txt text2.txt | uniq -u 
+1

Note à l'OP: pour sortir dans un fichier, il suffit de rediriger la sortie avec '> file.txt' à la fin de la commande, comme ceci:' sort text1.txt text2.txt | uniq -d> dups.txt' –

+0

via [clfu], pour les doublons (http://www.commandlinefu.com/commands/view/5707/intersection-between-two-files#comment): '(sort -u fichier1 ; sort -u fichier2) | trier | uniq -d' (cela semble faire la même chose et est plus court) –

1

dictionnaires Python sont O (1) ou très proche, autrement dit, ils sont très rapides (mais ils utilisent beaucoup de mémoire si les fichiers que vous l'indexation sont grandes). Alors d'abord lu dans le premier fichier et de construire un dictionnaire quelque chose comme:

left = [x.strip() for x in open('left.txt').readlines()] 

La compréhension de la liste et la bande() est nécessaire parce que readlines vous remet les lignes avec la queue intacte nouvelle ligne. Cela crée une liste de tous les éléments du fichier, en supposant un par ligne (utilisez .split s'ils sont tous sur une ligne).

Maintenant construire un dict:

ldi = dict.fromkeys(left) 

On construit ainsi un dictionnaire avec les éléments de la liste en tant que clés. Cela concerne également les doublons. Maintenant parcourez le deuxième fichier et vérifiez si la clé est dans le dict:

matches = open('matches.txt', 'w') 
uniq = open('uniq.txt', 'w') 
for l in open('right.txt').readlines(): 
    if l.strip() in ldi: 
     # write to matches 
     matches.write(l) 
    else: 
     # write to uniq 
     uniq.write(l) 
matches.close() 
uniq.close() 
+0

Pensez-y, cela a gagné 'trouver les noms uniques dans left.txt. Assez simple pour simplement refléter la solution dict pour obtenir cela, mais vous pouvez également regarder le type "set" de python, qui vous permet de déterminer facilement l'intersection/différence. – izak

16

tri | uniq est bon, mais comm pourrait être encore mieux. "man comm" pour plus d'informations.

A partir de la page de manuel:

EXAMPLES 
     comm -12 file1 file2 
       Print only lines present in both file1 and file2. 

     comm -3 file1 file2 
       Print lines in file1 not in file2, and vice versa. 

Vous pouvez également utiliser le type de jeu de Python, mais comm est plus facile.

0
>>> with open('first.txt') as f1, open('second.txt') as f2: 
     w1 = set(f1) 
     w2 = set(f2) 


>>> with open('matches.txt','w') as fout1, open('differences.txt','w') as fout2: 
     fout1.writelines(w1 & w2) 
     fout2.writelines(w2 - w1) 


>>> with open('matches.txt') as f: 
     print f.read() 


bob 
mark 
tom 
>>> with open('differences.txt') as f: 
     print f.read() 


bruce 
Questions connexes