diff
pode não ser a ferramenta mais adequada para isso. Eu tentaria escrever um script simples que faz especificamente o que você quer.
Tudo na memória
Esta é uma solução muito simples e genérica. Ele carrega os dois arquivos em estruturas de memória minimalista, subtrai os registros de subset.txt
dos registros de all.txt
e grava o restante.
#!/usr/bin/env python
with open('diff.txt', 'w') as diff:
for record in set(open('all.txt', 'r')) - set(open('subset.txt', 'r')):
diff.write(record)
Salve em um arquivo como create_diff.py
e, em seguida, chmod +x create_diff.py
e execute-o no diretório onde estão seus dois arquivos.
Apenas subconjunto na memória
Se você precisar otimizar ainda mais para um consumo de memória menor, também seria possível fazer isso sem carregar os arquivos inteiros na memória, especialmente all.txt
não precisa ser carregado completamente na memória, mas pode ser iterado apenas uma vez .
#!/usr/bin/env python
subset_txt = open('subset.txt', 'r')
subset = subset_txt.readlines()
subset_txt.close()
with open('diff.txt', 'w') as diff_txt:
with open('all.txt', 'r') as all_txt:
for line in all_txt:
if line not in subset:
diff_txt.write(line)
Baseado em E / S
Essa deve ser a variante mais lenta, porque depende muito de E / S, mas ela tem pouca memória, porque não exige que os arquivos inteiros sejam carregados na memória. Ele funciona, não importa se seus arquivos estão classificados / unidos ou não.
#!/usr/bin/env python
diff_txt = open('diff.txt', 'w')
with open('all.txt', 'r') as all_txt:
with open('subset.txt', 'r') as subset_txt:
for all_line in all_txt:
found = False
for sub_line in subset_txt:
if all_line == sub_line:
found = True
break
if found is False:
diff_txt.write(all_line)
subset_txt.seek(0)
diff_txt.close()
Somente para arquivos classificados sem duplicatas < - recomendados no seu caso
Se tiver certeza de que seus arquivos estão ordenados e não contêm duplicatas, essa deve ser a melhor solução. Ambos os arquivos são lidos apenas uma vez e não precisam ser completamente carregados na memória.
#!/usr/bin/env python
diff_txt = open('diff.txt', 'w')
with open('all.txt', 'r') as all_txt:
with open('subset.txt', 'r') as subset_txt:
subset_line = subset_txt.readline()
for all_line in all_txt:
if all_line == subset_line:
subset_line = subset_txt.readline()
else:
diff_txt.write(all_line)
diff_txt.close()