Dizendo que tenho dois arquivos: a.txt
e b.txt
.
O conteúdo de a.txt
:
hello world
O conteúdo de b.txt
:
hello world
something else
Claro que posso usar vimdiff
para verificar a diferença deles, posso ter certeza de que a.txt
é um subconjunto de b.txt
, o que significa que b.txt
deve conter todas as linhas existentes em a.txt
(como no exemplo acima).
Minha pergunta é como gravar linhas que existem, b.txt
mas não existem em a.txt
um arquivo?
Exclui
-1
linhas que estão apenas ema.txt
, e-3
exclui linhas que estão em ambos. Assim, apenas as linhas exclusivamente emb.txt
são emitidas (consulteman comm
oucomm --help
para obter detalhes). A saída é redirecionada parac.txt
Se você quiser a diferença entre os dois arquivos, use
diff
em vez decomm
. por exemploSe você não se importa com o subconjunto, pode usar apenas
.
Limitação : este não é um diff de arquivo real, mais como um conjunto de diff de linhas (mas você pode precisar exatamente disso).
Todas as diferenças entre
a.txt
eb.txt
:Linhas que faltam
a.txt
(ignorando as linhas que faltamb.txt
):Explicação: depois
cat
esort
os 2 arquivos juntos você tem as linhas do subconjunto duplicadas,uniq -u
mostra apenas as linhas uniq, essas são as linhas que estão presentes apenas em um dos arquivos. A duplicação de uma das entradas (a.txt
acima) suprime todas as linhas existentes nesse arquivo na saída.A duplicação em qualquer um dos arquivos arruína a saída dos comandos acima, se você tiver duplicatas em seus arquivos, será necessário removê-los primeiro e executar os comandos acima nos arquivos recém-criados:
Você pode verificar o resultado, este 2 comando deve fornecer a mesma soma de verificação:
Se um dos arquivos for um superconjunto do outro (portanto, possui todas as linhas do outro mais (talvez) mais), você pode simplificar um pouco. Como no seu exemplo,
b.txt
é o superconjunto, portanto, esses 2 comandos também devem fornecer a mesma soma de verificação:b.txt - a.txt :
sort a.txt a.txt b.txt | uniq -u > foo.txt