%20no%20Linux%3F.png)
Tenho dois arquivos de texto onde a ordem das linhas não importa. Quero descobrir as linhas que são diferentes em um arquivo para outro. Usar diff no Linux encontra a diferença, mas também leva em conta a mudança nas linhas do mesmo texto.
Em outras palavras, como faço uma diferença insensível à linha?
Responder1
Se seus arquivos não forem muito grandes, você pode sort
salvá-los antes de diff
iniciá-los.
Então, algo assim funcionaria:
sort file1 > file1_sorted
sort file2 > file2_sorted
diff file1_sorted file2_sorted
Ou, como você descobriu nos comentários, você também pode fazer isso em uma linha,
diff <(sort file1) <(sort file2)
Responder2
Semelhante às diff
opções, você pode usar o comm
comando com as substituições de processos e sort
( comm
requer que os arquivos nos quais ele opera sejam classificados). Isso permitiria que você se concentrasse apenas nas linhas comuns, apenas nas linhas que estão em um arquivo ou outro, usando -1
para suprimir linhas apenas no primeiro arquivo, -2
para suprimir linhas apenas no segundo arquivo ou -3
para suprimir linhas em ambos, para veja todas as linhas que estão apenas no primeiro arquivo e não no segundo que você poderia fazer
comm -23 <(sort file1) <(sort file2)
claro, se você quiser, também pode considerar usar grep
like
grep -vFxf file2 file1
que tratará as linhas file2
como padrões e imprimirá apenas as linhas do arquivo1 que não possuem correspondências ( -v
) ao tratar as linhas de ( -f
) file2
como strings fixas ( -F
) que devem corresponder à linha inteira ( -x
).
A grep
solução tem a vantagem de não precisar ordenar os arquivos, mas apenas verifica se há linhas em um dos arquivos que não estão no outro, e não nas duas direções ao mesmo tempo.