¿Cómo eliminar palabras del archivo txt que existe en otro archivo txt?

8

El archivo a.txttiene aproximadamente 100k palabras, cada palabra está en una nueva línea

july.cpp
windows.exe
ttm.rar
document.zip

El archivo b.txttiene 150k palabras, una palabra por línea: algunas palabras son del archivo a.txt, pero algunas son nuevas:

july.cpp    
NOVEMBER.txt    
windows.exe    
ttm.rar    
document.zip    
diary.txt

¿Cómo puedo fusionar estos archivos en uno, eliminar todas las líneas duplicadas y mantener las líneas que son nuevas (líneas que existen a.txtpero no existen b.txty viceversa)?

Kate-Kasia
fuente
¿Estarías feliz de usar Python?
Tim
2
@ MikołajBartnicki Unix.SE probablemente sería un mejor lugar para preguntar
Glutanimate
1
Kasia, he cometido un error en mi respuesta, por eso lo eliminé. Estoy trabajando en uno nuevo.
2
@Glutanimate Esta pregunta está perfectamente bien aquí.
Seth
1
@Glutanimate Ah, lo siento, me perdí ese comentario de alguna manera.
Seth

Respuestas:

13

Hay un comando para hacer esto: comm. Como se indica en man comm, es simple:

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

Tenga en cuenta que commespera que el contenido de los archivos se ordene, por lo que debe ordenarlos antes de invocarlos comm, así:

sort unsorted-file.txt > sorted-file.txt

Así que para resumir:

sort a.txt > as.txt

sort b.txt > bs.txt

comm -3 as.txt bs.txt > result.txt

Después de los comandos anteriores, habrá líneas esperadas en el result.txtarchivo.


fuente
gracias, funciona como un encanto. PD. a zdjęcie z tłuczkiem na Twoim profilu jest fajne ;-)
Kate-Kasia
2

Aquí hay un breve script python3, basado en la respuesta de Germar , que debería lograr esto mientras se mantiene b.txtel orden sin clasificar.

#!/usr/bin/python3

with open('a.txt', 'r') as afile:
    a = set(line.rstrip('\n') for line in afile)

with open('b.txt', 'r') as bfile:
    for line in bfile:
        line = line.rstrip('\n')
        if line not in a:
            print(line)
            # Uncomment the following if you also want to remove duplicates:
            # a.add(line)
Lily Chung
fuente
1
#!/usr/bin/env python3

with open('a.txt', 'r') as f:
    a_txt = f.read()
a = a_txt.split('\n')
del(a_txt)

with open('b.txt', 'r') as f:
    while True:
        b = f.readline().strip('\n ')
        if not len(b):
            break
        if not b in a:
            print(b)
Germar
fuente
2
¡Hombre, estás disparando a un mosquito con un cañón naval!
:-) Tienes razón. Me perdí la 'k' en 100k
Germar
1

Echa un vistazo al commcomando coreutils :man comm

NAME
       comm - compare two sorted files line by line

SYNOPSIS
       comm [OPTION]... FILE1 FILE2

DESCRIPTION
       Compare sorted files FILE1 and FILE2 line by line.

       With  no  options,  produce  three-column  output.  Column one contains
       lines unique to FILE1, column two contains lines unique to  FILE2,  and
       column three contains lines common to both files.

       -1     suppress column 1 (lines unique to FILE1)

       -2     suppress column 2 (lines unique to FILE2)

       -3     suppress column 3 (lines that appear in both files)

Entonces, por ejemplo, puedes hacer

$ comm -13 <(sort a.txt) <(sort b.txt)
diary.txt
NOVEMBER.txt

(líneas exclusivas de b.txt)

conductor de acero
fuente