Como fazer uma diferença insensível a linha (diff) no Linux?

Como fazer uma diferença insensível a linha (diff) no Linux?

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 sortsalvá-los antes de diffiniciá-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 diffopções, você pode usar o commcomando com as substituições de processos e sort( commrequer 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 -1para suprimir linhas apenas no primeiro arquivo, -2para suprimir linhas apenas no segundo arquivo ou -3para 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 greplike

grep -vFxf file2 file1

que tratará as linhas file2como padrões e imprimirá apenas as linhas do arquivo1 que não possuem correspondências ( -v) ao tratar as linhas de ( -f) file2como strings fixas ( -F) que devem corresponder à linha inteira ( -x).

A grepsoluçã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.

informação relacionada