Usando diff em um arquivo longo de uma linha


25

Eu tenho um arquivo que possui apenas uma linha. Seu tamanho é de cerca de 20.000 bytes.

O arquivo foi modificado e eu queria saber onde.

Eu pensei em usar diff, mas ele me mostra a linha completa, porque gera a linha que tem a diferença - mas, neste caso, é a única linha no arquivo que tem diferenças.

Então, eu queria ver qual é a diferença.

Algum conselho?



2
você tentou canalizá-lo para o fmt (se você estiver usando o linux, é claro), você poderia fazer "fmt -w 50 long.txt | diff" #
l1zard 30/12/12

Respostas:


13

Supondo que haja muitos espaços em branco, como no texto normal, você pode dividir o arquivo por palavras e compará-lo com uma ferramenta diff normal, por exemplo, meld:

tr -s ' ' '\n' < file1.txt > file1.txt.split
tr -s ' ' '\n' < file2.txt > file2.txt.split
meld file1.txt.split file2.txt.split

2
Parece ser a solução mais direta para mim. O problema de diff em si é trivial, no entanto, a maioria das ferramentas (não apenas as ferramentas de diff) não pode gerenciar linhas longas, portanto o problema está lidando com linhas longas, e não com a própria diferença.
p1100i

4

Eu encontraria um diff que faz diffs intra-linha. Eu uso o xxdiff no UNIX. Eu acho que o WinMerge faz diff intra-line no Windows.

As outras respostas também são boas: wdiff ou dividir em partes - os limites das partes são mais fáceis de definir se os dados são delimitados por digamos um tubo ou uma vírgula.


11
FYI, xxdiff segfaults se as linhas são mais longas do que 32768 caracteres ...
ValarDohaeris

3

Se esse for um problema único, eu criaria cópias dos arquivos com \ncaracteres inseridos a cada 50 caracteres e depois as difere. (Escolhi 50 porque facilita a matemática, passando de um número de linha diferente para o deslocamento de bytes nos arquivos originais, mas pode ajustar isso para cima / para baixo com base no que encontrei.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.