Eu tenho uma série de arquivos de texto para os quais gostaria de conhecer as linhas em comum e não as linhas diferentes entre elas. Linha de comando unix ou windows está bem.
foo:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
Barra:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
Portanto, considerando esses dois arquivos acima, a saída do utilitário desejado seria semelhante a file1:line_number, file2:line_number == matching text
(apenas uma sugestão, eu realmente não me importo com a sintaxe):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
obrigado.
command-line
diff
Matt Wilson
fonte
fonte
Respostas:
No * nix, você pode usar comm . A resposta para a pergunta é:
Aqui está o uso completo de
comm
:Observe também que é importante classificar os arquivos antes de usar o comm, conforme mencionado nas páginas de manual.
fonte
Encontrei esta resposta em uma pergunta listada como duplicada . Acho que o grep é mais amigável ao administrador que o comm, portanto, se você quiser apenas o conjunto de linhas correspondentes (útil para comparar CSVs, por exemplo), basta usar
ou a versão simplificada do fgrep
Além disso, você pode usar o
file2*
glob e procurar linhas em comum com vários arquivos, em vez de apenas dois.Algumas outras variações úteis incluem
-n
flag para mostrar o número da linha de cada linha correspondente-c
para contar apenas o número de linhas que correspondem-v
para exibir apenas as linhas no arquivo2 que diferem (ou usamdiff
).O uso
comm
é mais rápido, mas essa velocidade custa às custas de ter que classificar seus arquivos primeiro. Não é muito útil como um 'diff reverso'.fonte
-v
bandeira depois que eu mesma a usei . Digamos que você tenha dois arquivos csv file1 e file2 e eles tenham linhas sobrepostas e não sobrepostas. Se você quiser todas e apenas as linhas não sobrepostas, usefgrep -v file1 file2
retornará apenas as linhas não sobrepostas no arquivo2 e nenhuma das linhas não sobrepostas adicionais no arquivo1 . Isso pode ser óbvio para alguns, mas é melhor afirmar o óbvio do que a má interpretação do risco. Nesse caso específico, classificar e usar os arquivoscomm
ainda é a melhor escolha.grep
: qualquer linha em branco no primeiro arquivo corresponderá a todas as linhas no segundo arquivo. Verifique sefile1
não há linhas em branco ou os arquivos serão idênticos.grep -Fxf
é para mim.Foi perguntado aqui antes: comando Unix para encontrar linhas comuns em dois arquivos
Você também pode tentar com perl (o crédito vai aqui )
fonte
comm
não estava prontamente disponível. Essa foi a alternativa perfeita.Acabei de aprender o comando comm neste segmento, mas queria adicionar algo extra: se os arquivos não forem classificados e você não quiser tocar nos arquivos originais, poderá canalizar o outptut do comando sort. Isso deixa os arquivos originais intactos. Funciona no bash, não posso dizer sobre outras conchas.
Isso pode ser estendido para comparar a saída do comando, em vez dos arquivos:
fonte
A maneira mais fácil de fazer é:
Os arquivos não são necessários para serem classificados.
fonte
Apenas para informação, criei uma pequena ferramenta para o Windows fazendo a mesma coisa que "grep -F -x -f arquivo1 arquivo2" (como não encontrei nada equivalente a este comando no Windows)
Aqui está: http://www.nerdzcore.com/?page=commonlines
O uso é "CommonLines inputFile1 inputFile2 outputFile"
O código fonte também está disponível (GPL)
fonte
No Windows, você pode usar um script do Powershell com CompareObject
CompareObject:
fonte