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

8

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

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

O arquivo b.txt tem 150 mil palavras, uma palavra por linha - algumas palavras são do arquivo 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 linhas novas (linhas que existem em a.txt , mas não existem em b.txt e vice-versa)?

    
por Kate-Kasia 25.07.2014 / 23:33

4 respostas

13

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

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

Observe que comm espera que o conteúdo dos arquivos seja classificado, portanto você deve classificá-los antes de chamar comm neles, assim:

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

Então, 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á linhas esperadas no arquivo result.txt .

    
por user280493 26.07.2014 / 00:06
2

Aqui está um pequeno script python3, baseado na resposta de Germar , que deve conseguir isso enquanto retém b.txt 's 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)
    
por ikdc 26.07.2014 / 03:39
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)
    
por Germar 26.07.2014 / 00:09
1

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 )

    
por steeldriver 26.07.2014 / 00:11