Existem dois arquivos chamados "a.txt" e "b.txt", ambos possuem uma lista de palavras. Agora, quero verificar quais palavras são extras em "a.txt" e não em "b.txt" .
Eu preciso de um algoritmo eficiente, pois preciso comparar dois dicionários.
linux
terminal
diff
file-comparison
Ali Imran
fonte
fonte
diff a.txt b.txt
não é o suficiente?Respostas:
Se você possui o vim instalado, tente o seguinte:
ou
você achará fantástico.
fonte
Classifique-os e use
comm
:comm
compara os arquivos de entrada (classificados) e, por padrão, gera três colunas: linhas exclusivas de a, linhas exclusivas de be linhas presentes em ambas. Especificando-1
,-2
e / ou-3
você pode suprimir a saída correspondente. Portanto,comm -23 a b
lista apenas as entradas exclusivas de a. Eu uso a<(...)
sintaxe para classificar os arquivos em tempo real, se eles já estiverem classificados, você não precisa disso.fonte
comm
é mais eficiente porque faz o trabalho em uma única execução, sem armazenar o arquivo inteiro na memória. Como você está usando dicionários que provavelmente já estão classificados, você nem precisasort
deles. O uso,grep -f file1 file2
por outro lado, carregará o todofile1
na memória e comparará cada linhafile2
com todas essas entradas, o que é muito menos eficiente. É principalmente útil para pequenas, sem classificação-f file1
.\n
também será incluído para fazer comparações.Experimente
sdiff
(man sdiff
)fonte
Você pode usar a
diff
ferramenta no linux para comparar dois arquivos. Você pode usar as opções - formato de grupo alterado e - formato de grupo alterado - para filtrar os dados necessários.As três opções a seguir podem ser usadas para selecionar o grupo relevante para cada opção:
'% <' obtém linhas de FILE1
'%>' obtém linhas de FILE2
'' (string vazia) para remover linhas de ambos os arquivos.
fonte
Se você preferir o estilo de saída diff
git diff
, poderá usá-lo com o--no-index
sinalizador para comparar arquivos que não estão em um repositório git:Usando um par de arquivos com cerca de 200k seqüências de nomes de arquivos em cada um deles, eu comparei (com o
time
comando interno) essa abordagem contra algumas das outras respostas aqui:comm
parece ser o mais rápido de longe, enquantogit diff --no-index
parece ser a abordagem mais rápida para saída no estilo diff.Atualização 2018-03-25 Na verdade, você pode omitir o
--no-index
sinalizador, a menos que esteja dentro de um repositório git e queira comparar arquivos não rastreados dentro desse repositório. Nas páginas do manual :fonte
Você também pode usar: colordiff : Exibe a saída do diff com cores.
Sobre o vimdiff : permite comparar arquivos via SSH, por exemplo:
Extraído de: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
fonte
Além disso, não se esqueça do mcdiff - Visualizador de diferenças internas do GNU Midnight Commander .
Por exemplo:
Aproveitar!
fonte
Use
comm -13
(requer arquivos classificados) :fonte
Aqui está a minha solução para isso:
fonte
sdiff -s file1 file2
foi útil.Usando awk para isso. Arquivos de teste:
O awk:
Duplicatas são produzidas:
Para evitar duplicatas, adicione cada palavra recém-encontrada em a.txt ao
seen
hash:Resultado:
Se as listas de palavras forem separadas por vírgula, como:
você tem que fazer algumas voltas extras (
for
loops):Saída desta vez:
fonte