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

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

El archivo a.txttiene alrededor de 100.000 palabras, cada palabra está en una nueva línea.

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

El archivo b.txttiene 150.000 palabras, una palabra por línea; algunas palabras son del archivo a.txt, pero algunas palabras 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 conservar las líneas nuevas (líneas que existen a.txtpero que no existen b.txty viceversa)?

Respuesta1

Hay un comando para hacer esto: comm. Como se indica en man comm, es muy 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 esté ordenado, por lo que debe ordenarlos antes de llamarlos comm, así como 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.

Respuesta2

Aquí hay un breve script de Python3, basado enLa respuesta de Germar., que debería lograr esto manteniendo 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)

Respuesta3

#!/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)

Respuesta4

Eche 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)

información relacionada