Eu tenho alguns despejos sql que eu estou olhando para as diferenças entre. diff
obviamente, pode me mostrar a diferença entre duas linhas, mas estou me deixando louco tentando descobrir quais valores na longa lista de valores separados por vírgula são realmente os que fazem com que as linhas sejam diferentes.
Que ferramenta posso usar para apontar as diferenças exatas de caracteres entre duas linhas em determinados arquivos?
command-line
diff
user394
fonte
fonte
Respostas:
Há wdiff , a palavra diff para isso.
Na área de trabalho, o meld pode destacar as diferenças dentro de uma linha para você.
fonte
wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" file1 file2
wdiff a b | colordiff
dwdiff
ferramenta que é compatível principalmente,wdiff
mas também suporta saída colorida e provavelmente alguns outros recursos. E está mais disponível em algumas distribuições Linux como o Arch.wdiff -n a b | colordiff
, aconselhaman colordiff
.Apenas outro método usando git-diff:
grep -v se não estiver interessado nas posições dos diffs.
fonte
Eu usei
vimdiff
para isso.Aqui está uma captura de tela (não minha) mostrando pequenas diferenças de um ou dois caracteres que se destacam muito bem. Um tutorial rápido também .
fonte
vimdiff -c 'set wrap' -c 'wincmd w' -c 'set wrap' a b
, sugere stackoverflow.com/a/45333535/2097284 .Aqui está um método "... cabelo do cachorro que mordeu você" ...
diff
chegou a esse ponto; use-o para levar você mais longe ...Aqui está a saída do uso dos pares de linhas de amostra ...
☻
indica um TABAqui está o script. Você só precisa descobrir os pares de linhas de alguma forma. (Eu usei o diff apenas uma vez (duas vezes?) Antes de hoje, então não conheço suas muitas opções e resolvo as opções para isso. script foi o suficiente para mim, por um dia :) .. Eu acho que deve ser simples o suficiente, mas devo fazer uma pausa para o café ....
fonte
wdiff
é realmente um método muito antigo de comparar arquivos palavra por palavra. Ele funcionou reformatando arquivos e depois usandodiff
para encontrar diferenças e devolvê-lo novamente. Eu próprio sugeri adicionar contexto, para que, em vez de comparar palavra por palavra, o faça com cada palavra cercada por outras palavras de "contexto". Isso permite que o diff se sincronize em passagens comuns em arquivos muito melhor, especialmente quando os arquivos são principalmente diferentes com apenas alguns blocos de palavras comuns. Por exemplo, ao comparar texto para plágio ou reutilização.dwdiff
foi criado mais tardewdiff
. Masdwdiff
usa essa função de reformatação de texto com bons resultados emdwfilter
. Esse é um ótimo desenvolvimento - significa que você pode reformatar um texto para coincidir com outro e compará-lo usando qualquer visualizador gráfico de linha por linha. Por exemplo, usando-o com diferenças gráficas "difusas" ....Isso reformata
file1
o formato defile2
e fornece issodiffuse
para uma comparação visual.file2
não é modificado, para que você possa editar e mesclar diferenças de palavras diretamente nelediffuse
. Se você deseja editarfile1
, você pode adicionar-r
para reverter qual arquivo é reformatado. Experimente e você verá que é extremamente poderoso!Minha preferência pelo diff gráfico (mostrado acima) é
diffuse
como parece muito mais limpo e mais útil. Além disso, é um programa python independente, o que significa que é fácil de instalar e distribuir para outros sistemas UNIX.Outras diferenças gráficas parecem ter muitas dependências, mas também podem ser usadas (sua escolha). Estes incluem
kdiff3
ouxxdiff
.fonte
Usando a solução do @ Peter.O como base, eu a reescrevi para fazer várias alterações.
./hairOfTheDiff.sh file1.txt file2.txt
demo
fonte; isso pode abrir a porta para tubulações sofisticadas, a fim de não precisar de arquivos para duas entradas separadas também, usandopaste
e vários descritores de arquivos.Sem destaque significa que o personagem estava nas duas linhas, destaque significa que estava na primeira e vermelho significa que estava na segunda.
As cores são alteráveis por meio de variáveis na parte superior do script e você pode até renunciar inteiramente às cores usando caracteres normais para expressar diferenças.
fonte
Aqui está uma simples linha:
diff -y <(cat a.txt | sed -e 's/,/\n/g') <(cat b.txt | sed -e 's/,/\n/g')
A idéia é substituir vírgulas (ou qualquer delimitador que você deseja usar) por novas linhas usando
sed
.diff
depois cuida do resto.fonte
.csv
é fácil criar uma planilha a partir de , e uma fórmula(A7==K7) ? "" : "diff"
ou similar é inserida e copiada.fonte
Na linha de comando, certifique-se de adicionar novas linhas criteriosas antes de comparar arquivos. Você pode usar sed, awk, perl ou qualquer outra coisa para adicionar quebras de linha de alguma forma sistemática - certifique-se de não adicionar muitas.
Mas acho que o melhor é usar o vim, pois destaca as diferenças de palavras. O vim é bom se não houver muitas diferenças e as diferenças forem simples.
fonte
O kdiff3 está se tornando o visualizador padrão da GUI no Linux. É semelhante ao xxdiff , mas acho que o kdiff3 é melhor. Ele faz muitas coisas bem, incluindo sua solicitação para mostrar "diferenças exatas de caracteres entre duas linhas em determinados arquivos".
fonte
Se estou lendo sua pergunta corretamente, eu uso
diff -y
para esse tipo de coisa.Torna a comparação de uma comparação lado a lado muito mais simples para descobrir quais linhas estão apresentando as diferenças.
fonte
Eu tive o mesmo problema e resolvi-o com o PHP Fine Diff , uma ferramenta on-line que permite especificar granularidade. Eu sei que não é tecnicamente uma ferramenta * nix, mas eu realmente não queria baixar um programa apenas para fazer uma comparação única de nível de caractere.
fonte