Eu tenho "test1.csv" e ele contém
200,400,600,800
100,300,500,700
50,25,125,310
e test2.csv e ele contém
100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
agora
diff test2.csv test1.csv > result.csv
é diferente de
diff test1.csv test2.csv > result.csv
Não sei qual é a ordem correta, mas quero outra coisa, os dois comandos acima produzirão algo como
2 > 100,4,2,1,7
3 2,3c3,5
4 < 100,300,500,700
5 < 50,25,125,310
6 \ No newline at end of file
7 ---
8 > 21,22,23,24,25
9 > 50,25,125,310
Eu quero mostrar apenas a diferença, assim o results.csv deve ficar assim
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Eu tentei diff -q
e diff -s
eles não fizeram o truque. A ordem não importa, o que importa é que eu quero ver apenas a diferença, nem> nem <nem espaço em branco.
grep -FvF
fez o truque em arquivos menores e não em arquivos grandes
o primeiro arquivo contém mais de 5 milhões de linhas, o segundo arquivo contém 1300.
portanto results.csv deve resultar em ~ 4.998.700 linhas
Eu também tentei o grep -F -x -v -f
que não funcionou.
50,25,125,310
é comum a ambos necessidade file..you para remover que a partir da saída desejada ..Respostas:
Parece um trabalho para
comm
:Como explicado em
man comm
:Portanto,
-3
significa que apenas as linhas exclusivas de um dos arquivos serão impressas. No entanto, esses são recuados de acordo com o arquivo em que foram encontrados. Para remover a guia, use:Nesse caso, você nem precisa classificar os arquivos e pode simplificar o acima para:
fonte
200,[...]
linha, hein? :)Usando
grep
combash
substituição de processo:Para salvar a saída como
results.csv
:<()
é obash
padrão de substituição de processogrep -vFf test2.csv test1.csv
encontrará as linhas exclusivas para apenastest1.csv
grep -vFf test1.csv test2.csv
encontrará as linhas exclusivas para apenastest2.csv
Finalmente, estamos resumindo os resultados por
cat
Ou, como Oli sugeriu , você também pode usar o agrupamento de comandos:
Ou simplesmente execute um após o outro, pois ambos estão escrevendo para STDOUT e serão adicionados:
fonte
cat
dois comandos redirecionados? Por que não apenas executar um depois o outro?grep ... ; grep ...
ou{ grep ... ; grep ... ; }
se você quisesse fazer algo com a saída coletiva.Se a ordem das linhas não for relevante, use
awk
ouperl
:Use
grep
para obter as linhas comuns e filtrá-las:O grep interno obtém as linhas comuns e, em seguida, o grep externo encontra linhas que não correspondem a essas linhas comuns.
fonte
sort | uniq -u
, o que fornece a resposta errada quando um arquivo contém linhas duplicadas. Para grep, eu diria "interno" / "externo", não "interno" / "externo".awk
vai imprimir e qual ocomm -3
ediff
respostas serão impressas.comm -3
. Eu não vejo nenhuma razão para que eu deveria explicar isso. Se você deseja editar uma nota, fique à vontade.Use as
--*-line-format=...
opções dediff
Você pode dizer
diff
exatamente o que precisa - explicado abaixo:É possível especificar a saída do diff de uma maneira muito detalhada, semelhante a um
printf
formato numérico.As linhas do primeiro arquivo
test1.csv
são chamadas de linhas "antigas" e as do segundotest2.csv
são "novas". Isso faz sentido quandodiff
é usado para ver o que mudou em um arquivo.As opções de que precisamos são as que definem o formato para as linhas "antigas", "novas" e "inalteradas".
Os formatos que precisamos são muito simples:
para as linhas alteradas, novas e antigas, queremos exibir apenas o texto das linhas.
%L
é o símbolo de formato para o texto da linha.Para as linhas inalteradas, não queremos mostrar nada.
Com isso, podemos escrever opções como
--old-line-format='%L'
e reunir tudo, usando seus dados de exemplo:Notas sobre desempenho
Como os arquivos têm tamanho diferente, tente trocar os arquivos de entrada, se isso não interessar, pode ser que o funcionamento interno de
diff
possa lidar de uma maneira melhor que a outra. Melhor é precisar de menos memória ou menos computação.Há uma opção de otimização para uso
diff
com arquivos grandes:--speed-large-files
. Ele usa suposições sobre a estrutura do arquivo, portanto, não está claro se isso ajuda no seu caso, mas vale a pena tentar.As opções de formato estão descritas
man diff
abaixo--LTYPE-line-format=LFMT
.fonte
Como o pedido não precisa ser preservado, basta:
sort test1.csv test2.csv
: mescla e classificatest1.csv
etest2.csv
uniq -u
: imprime apenas as linhas que não possuem duplicadofonte
diff
resultado.