Como deletar palavras do arquivo txt, que existe em outro arquivo txt?

Como deletar palavras do arquivo txt, que existe em outro arquivo txt?

O arquivo a.txttem cerca de 100 mil palavras, cada palavra está em uma nova linha

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

O arquivo b.txttem 150 mil palavras, uma palavra por linha - algumas palavras são de file a.txt, mas algumas palavras são novas:

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

Como posso mesclar esses arquivos em um, excluir todas as linhas duplicadas e manter as linhas novas (linhas que existem, a.txtmas não existem b.txt, e vice-versa)?

Responder1

Existe um comando para fazer isso: comm. Como afirmado em man comm, é muito simples:

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

Observe que commespera que o conteúdo dos arquivos seja classificado, portanto, você deve classificá-los antes de acessá- commlos, assim:

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

Entao, para resumir:

sort a.txt > as.txt

sort b.txt > bs.txt

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

Após os comandos acima, você terá as linhas esperadas no result.txtarquivo.

Responder2

Aqui está um pequeno script python3, baseado emA resposta de Germar, que deve fazer isso mantendo b.txta ordem não classificada.

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

Responder3

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

Responder4

Dê uma olhada no comando coreutils comm-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)

Então, por exemplo, você pode fazer

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

(linhas exclusivas para b.txt)

informação relacionada