2010-11-12 18 views
2

J'ai deux fichiers (pouvant contenir jusqu'à 150 000 lignes, chaque ligne fait 160 octets), que je voudrais vérifier pour voir si les lignes dans chacun est le même. diff ne fonctionnera pas pour moi (directement) parce qu'un petit pourcentage des lignes se produisent dans un ordre différent dans les deux fichiers. Typiquement, une paire de lignes sera transposée.
Quelle est la meilleure façon de voir si les mêmes lignes apparaissent dans les deux fichiers, mais où l'ordre n'a pas d'importance? Merci, ChrisComparer deux fichiers pour des lignes identiques où l'ordre n'a pas d'importance

Répondre

3

Bien qu'il soit un moyen de le faire un peu cher (pour quoi que ce soit plus je repenser), je virerais en python et procédez comme suit:

filename1 = "WHATEBVER YOUR FILENAME IS" 
filename2 = "WHATEVER THE OTHER ONE IS" 
file1contents = set(open(filename1).readlines()) 
file2contents = set(open(filename2).readlines()) 
if file1contents == file2contents: 
    print "Yup they're the same!" 
else: 
    print "Nope, they differ. In file2, not file1:\n\n" 
    for diffLine in file2contents - file1contents: 
     print "\t", diffLine 
    print "\n\nIn file1, not file2:\n\n" 
    for diffLine in file1contents - file2contents: 
     print "\t", diffLine 

Ce imprimerons les différentes lignes si ils diffèrent.

+0

Merci - Je venais d'écrire quelque chose de similaire en Python, car il n'y a pas de magie vaudou Unix funky déjà le faire. Problème résolu! – xnx

+3

Trier chaque fichier puis exécuter diff? –

+0

Ouais (+1), tu as raison à 100%, je déteste juste utiliser les fichiers temporaires! En 15 secondes en python je peux avoir la réponse et avoir accès aux différentes lignes dans les variables python ... – Crisfole

1

Pour seulement 150k lignes, il suffit de hacher chaque ligne et de les stocker dans une table de recherche. Ensuite, pour chaque ligne dans le fichier deux, il suffit d'effectuer la recherche.

0

Un autre script python pour ce faire:

#!/usr/bin/env python 
import sys 

file1 = sys.argv[1] 
file2 = sys.argv[2] 

lines1 = open(file1,'r').readlines() 
lines2 = open(file2,'r').readlines() 
lines1.sort() 
lines2.sort() 

s = '' 
for i,line in enumerate(lines1): 
    if lines2[i] != line: 
     print '> %s' % line 
     print '< %s' % lines2[i] 
     s = 'not' 

print 'file %s is %s like file %s' % (file1, s, file2)