Compara dos archivos para las diferencias en python

Quiero comparar dos archivos (tomar la línea del primer archivo y buscar en el segundo archivo completo) para ver las diferencias entre ellos y escribir la línea que falta desde el archivo A.txt hasta el final del archivo B.txt. Soy nuevo en Python, así que al principio pensé en un progtwig simple como este:

import difflib file1 = "fileA.txt" file2 = "fileB.txt" diff = difflib.ndiff(open(file1).readlines(),open(file2).readlines()) print ''.join(diff), 

pero como resultado tengo una combinación de dos archivos con tags adecuadas para cada línea. Sé que puedo buscar el inicio de línea con la etiqueta “-” y luego escribirla al final del archivo fileB.txt, pero con un archivo enorme (~ 100 MB) este método será ineficaz. ¿Alguien puede ayudarme a mejorar el progtwig?

La estructura del archivo será así:

entrada:

fileA.txt

 Oct 9 13:25:31 user sshd[12844]: Accepted password for root from 213.XXX.XXX.XX7 port 33254 ssh2 Oct 9 13:25:31 user sshd[12844]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:35:48 user sshd[12868]: Accepted password for root from 213.XXX.XXX.XX7 port 33574 ssh2 Oct 9 13:35:48 user sshd[12868]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:46:58 user sshd[12844]: Received disconnect from 213.XXX.XXX.XX7: 11: disconnected by user Oct 9 13:46:58 user sshd[12844]: pam_unix(sshd:session): session closed for user root Oct 9 15:47:58 user sshd[12868]: pam_unix(sshd:session): session closed for user root Oct 11 22:17:31 user sshd[2655]: Accepted password for root from 17X.XXX.XXX.X19 port 5567 ssh2 Oct 11 22:17:31 user sshd[2655]: pam_unix(sshd:session): session opened for user root by (uid=0) 

fileB.txt

  Oct 9 12:19:16 user sshd[12744]: Accepted password for root from 213.XXX.XXX.XX7 port 60554 ssh2 Oct 9 12:19:16 user sshd[12744]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:24:42 user sshd[12744]: Received disconnect from 213.XXX.XXX.XX7: 11: disconnected by user Oct 9 13:24:42 user sshd[12744]: pam_unix(sshd:session): session closed for user root Oct 9 13:25:31 user sshd[12844]: Accepted password for root from 213.XXX.XXX.XX7 port 33254 ssh2 Oct 9 13:25:31 user sshd[12844]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:35:48 user sshd[12868]: Accepted password for root from 213.XXX.XXX.XX7 port 33574 ssh2 Oct 9 13:35:48 user sshd[12868]: pam_unix(sshd:session): session opened for user root by (uid=0) 

Salida:

archivoB_after.txt

 Oct 9 12:19:16 user sshd[12744]: Accepted password for root from 213.XXX.XXX.XX7 port 60554 ssh2 Oct 9 12:19:16 user sshd[12744]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:24:42 user sshd[12744]: Received disconnect from 213.XXX.XXX.XX7: 11: disconnected by user Oct 9 13:24:42 user sshd[12744]: pam_unix(sshd:session): session closed for user root Oct 9 13:25:31 user sshd[12844]: Accepted password for root from 213.XXX.XXX.XX7 port 33254 ssh2 Oct 9 13:25:31 user sshd[12844]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:35:48 user sshd[12868]: Accepted password for root from 213.XXX.XXX.XX7 port 33574 ssh2 Oct 9 13:35:48 user sshd[12868]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:46:58 user sshd[12844]: Received disconnect from 213.XXX.XXX.XX7: 11: disconnected by user Oct 9 13:46:58 user sshd[12844]: pam_unix(sshd:session): session closed for user root Oct 9 15:47:58 user sshd[12868]: pam_unix(sshd:session): session closed for user root Oct 11 22:17:31 user sshd[2655]: Accepted password for root from 17X.XXX.XXX.X19 port 5567 ssh2 Oct 11 22:17:31 user sshd[2655]: pam_unix(sshd:session): session opened for user root by (uid=0) 

leer en dos archivos y convertir para establecer

encontrar unión de dos conjuntos
conjunto de unión de género basado en el tiempo
unir conjunto a cadena con nueva línea

 import datetime import file1 = "fileA.txt" file2 = "fileB.txt" with open(file1 ,'rb') as f: sa = set( line for line in f ) with open(file2 ,'rb') as f: sb = set( line for line in f ) print '\n'.join( sorted( sa.union(sb), key = lambda x: datetime.datetime.strptime( ' '.join( x.split()[:3]), '%b %d %H:%M:%S' )) ) Oct 9 12:19:16 user sshd[12744]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 12:19:16 user sshd[12744]: Accepted password for root from 213.XXX.XXX.XX7 port 60554 ssh2 Oct 9 13:24:42 user sshd[12744]: pam_unix(sshd:session): session closed for user root Oct 9 13:24:42 user sshd[12744]: Received disconnect from 213.XXX.XXX.XX7: 11: disconnected by user Oct 9 13:25:31 user sshd[12844]: Accepted password for root from 213.XXX.XXX.XX7 port 33254 ssh2 Oct 9 13:25:31 user sshd[12844]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:35:48 user sshd[12868]: Accepted password for root from 213.XXX.XXX.XX7 port 33574 ssh2 Oct 9 13:35:48 user sshd[12868]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 9 13:46:58 user sshd[12844]: pam_unix(sshd:session): session closed for user root Oct 9 13:46:58 user sshd[12844]: Received disconnect from 213.XXX.XXX.XX7: 11: disconnected by user Oct 9 15:47:58 user sshd[12868]: pam_unix(sshd:session): session closed for user root Oct 11 22:17:31 user sshd[2655]: pam_unix(sshd:session): session opened for user root by (uid=0) Oct 11 22:17:31 user sshd[2655]: Accepted password for root from 17X.XXX.XXX.X19 port 5567 ssh2 

Intenta con esto en la bash :

 cat fileA.txt fileB.txt | sort -M | uniq > new_file.txt 

sort -M : ordena en función de la cadena inicial, que consiste en cualquier cantidad de espacio en blanco, seguido de una abreviatura del nombre del mes, se pliega al caso SUPERIOR y se compara en el orden ‘JAN’ <'FEB' <... <'DEC'. Los nombres no válidos se comparan con nombres bajos a válidos La configuración regional `LC_TIME 'determina la ortografía mensual.

uniq: filtra las líneas repetidas en un archivo.

|: pasa la salida de un comando a otro para su posterior procesamiento.

Lo que esto hará es tomar los dos archivos, ordenarlos de la manera descrita anteriormente, mantener los elementos únicos y almacenarlos en new_file.txt

Nota: Esta no es una solución de Python, pero ha marcado la pregunta con linux así que pensé que podría interesarle. También puede encontrar información más detallada sobre los comandos utilizados, aquí .