O arquivo a.txt
tem cerca de 100 mil palavras, cada palavra está em uma 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 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.txt
mas 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 comm
espera que o conteúdo dos arquivos seja classificado, portanto, você deve classificá-los antes de acessá- comm
los, 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.txt
arquivo.
Responder2
Aqui está um pequeno script python3, baseado emA resposta de Germar, que deve fazer isso mantendo b.txt
a 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
)