Identificar diferenças entre linhas [RESOLVIDO]

1. Identificar diferenças entre linhas [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 29/08/2017 - 20:25h

Olá pessoal,

Tenho dois ficheiros, com a seguinte estrutura e conteúdo.

primeiro.txt tem os seguintes dados:

785 banana/carrot
458 fruit/5625
444 pear
444 ananas
214 chestnut
864 carrot


O segundo.txt é:

245 banana/carrot
534 fruit/5625
343 carrot
243 pear
345 ananas
943 chestnut


Preciso de ter um relatório, que deverá ser gravado num terceiro txt, criado no momento, que apenas menciona as linhas que são únicas, que por exemplo, existem no primeiro.txt mas não existem no segundo.txt.

Já andei a experimentar com o comando uniq, mas não tive grande sucesso. Já tentei testar com o comando diff. Ele reporta o que é diferente, faz a análise por linha. Acontece que preciso que a análise apenas tenha efeito após os 3 primeiros caracteres. A minha dúvida permanece aí! Como configuro o comando para que leia apenas a partir do terceiro caracter?

Obrigado

[UPDATE1]
Neste caso o relatório não teria nada escrito, pois é tudo igual. A única coisa que é diferente são os 3 primeiros caracteres em cada linha. Reparem também que a ordem não é a mesma. Acho que o diff lida bem com isso, certo?





  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 29/08/2017 - 22:15h

ede_linux escreveu:

Olá pessoal,

Tenho dois ficheiros, com a seguinte estrutura e conteúdo.

primeiro.txt tem os seguintes dados:

785 banana/carrot
458 fruit/5625
444 pear
444 ananas
214 chestnut
864 carrot


O segundo.txt é:

245 banana/carrot
534 fruit/5625
343 carrot
243 pear
345 ananas
943 chestnut


Preciso de ter um relatório, que deverá ser gravado num terceiro txt, criado no momento, que apenas menciona as linhas que são únicas, que por exemplo, existem no primeiro.txt mas não existem no segundo.txt.

Já andei a experimentar com o comando uniq, mas não tive grande sucesso. Já tentei testar com o comando diff. Ele reporta o que é diferente, faz a análise por linha. Acontece que preciso que a análise apenas tenha efeito após os 3 primeiros caracteres. A minha dúvida permanece aí! Como configuro o comando para que leia apenas a partir do terceiro caracter?

Obrigado

[UPDATE1]
Neste caso o relatório não teria nada escrito, pois é tudo igual. A única coisa que é diferente são os 3 primeiros caracteres em cada linha. Reparem também que a ordem não é a mesma. Acho que o diff lida bem com isso, certo?


Boa noite Ede, segue sugestão:
 sed -r 's/^.{4}//' Arquivo1.txt Arquivo2.txt|sort|uniq -u  

É sempre bom lembrar . . . :)
Obs: se a resposta foi satisfatória, marque o tópico como resolvido e escolha a MELHOR RESPOSTA!
Att.:
Marcelo Oliver


3. Re: Identificar diferenças entre linhas

Ede
ede_linux

(usa Ubuntu)

Enviado em 30/08/2017 - 05:52h

Olá marcelo,

Tentei fazer isto:

code@code:~/Documents/teste$ sed -r 's/^.{32}//' file1.txt | sed -r 's/^.{64}//' file2.txt |sort|uniq -u

ntc/_MG_0013.JPG
ntc/_MG_0016.JPG
ntc/_MG_001dsf3.JPG
ntc/_MG_0sdf016.JPG
code@code:~/Documents/teste$ ls
file1.txt file2.txt ntc
code@code:~/Documents/teste$ cat file1.txt
7252d6ca2777d22cbffe711f5260b2f8 ntc/_MG_0013.JPG
7252d6ca2777d22cbffe711f5260b2f8 ntc/_MG_001dsf3.JPG

cbaead175ea1190856fcccb6c50decba ntc/_MG_0016.JPG
cbaead175ea1190856fcccb6c50decba ntc/_MG_0sdf016.JPG
code@code:~/Documents/teste$ cat file2.txt
17879b6051a67ec7ebdcecd24a4d08eb2100fdcd100622584bb9e720d592cd08 ntc/_MG_0013.JPG
17879b6051a67ec7ebdcecd24a4d08eb2100fdcd100622584bb9e720d592cd08 ntc/_MG_001dsf3.JPG

47451fffd419ae793e363e852105d976d3f4b16c4eed7496b60584584ce398db ntc/_MG_0016.JPG
47451fffd419ae793e363e852105d976d3f4b16c4eed7496b60584584ce398db ntc/_MG_0sdf016.JPG


O seu código funcionou, mas estou a tentar adpatar para um outro cenário. No file1.txt tem que ignorar os primeiros 32 caracteres. No file2.txt tem que ignorar os 64 caracteres. O objectivo é comparar o resultado do md5sum com o sha256sum.

Estive a ler este site, http://aurelio.net/sed/sed-dicas.txt, para perceber o código que passas-te. Acontece que estou com problemas em definir 2 critérios no sed. Para o primeiro eu quero dizer, ignora os 32 primeiros. Para o segundo ignora os 64 primeiros. Pelo que percebi consigo ter os valores para ambos os files.txt, acontece que tenho que passar isso tudo para o uniq, para que através do parametro -u ele imprima apenas os valores diferentes, entre ficheiros...que neste caso será nada!

Obrigado pela ajuda


4. Re: Identificar diferenças entre linhas [RESOLVIDO]

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 30/08/2017 - 09:39h

Veja se assim resolve:
sed 's/.* //' arquivo1 arquivo2 | sort | uniq -u 



5. Re: Identificar diferenças entre linhas

Ede
ede_linux

(usa Ubuntu)

Enviado em 30/08/2017 - 10:01h

Olá,

Revolve:

sed -r 's/^.{4}//' Arquivo1.txt Arquivo2.txt|sort|uniq -u

sed 's/.* //' arquivo1 arquivo2 | sort | uniq -u


O que significa esta parte?

's/.* //'

A anterior consigui perceber, através do site que passei, mas a sua não! Acho que (/^.{4}) significa tudo o que está na linha a partir do quarto caracter, certo?

Obrigado
Nota: Uma vez que a resposta do MSOliver é que resolve o problema inicial, vou atribuir a ele a solução. Mas vou pontuar ambos pela grande ajuda! Muito Obrigado


6. Re: Identificar diferenças entre linhas [RESOLVIDO]

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 30/08/2017 - 10:38h

ede_linux escreveu:

O que significa esta parte?

's/.* //'

A anterior consigui perceber, através do site que passei, mas a sua não! Acho que (/^.{4}) significa tudo o que está na linha a partir do quarto caracter, certo?


.* significa todos os caracteres; no caso, o comando 's/.* //' diz ao sed para excluir todos os caracteres antes do espaço (se perceber tem um espaço depois do asterisco!). O comando original do Marcelo "^.{4}" diz ao sed para excluir os primeiros quatro caracteres, isto é, ^ indica o início da linha, o ponto representa um caractere e o {4} o número de caracteres. Acho que é isso :)


7. Re: Identificar diferenças entre linhas [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 30/08/2017 - 10:54h

Compreendi,

Estão a sintaxe

's/xx//'

é sempre igual, muda é o seu interior, certo? O que vem no lugar do xx é o que pretendo dizer ao sed, correcto?


8. Re: Identificar diferenças entre linhas [RESOLVIDO]

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 30/08/2017 - 11:10h

ede_linux escreveu:

Compreendi,

Estão a sintaxe

's/xx//'

é sempre igual, muda é o seu interior, certo? O que vem no lugar do xx é o que pretendo dizer ao sed, correcto?


Assim, o "s" quer dizer "procurar e substituir".
's/X/Y/' onde "X" é o que procurar e "Y" é com o que substituir. Ou seja, a primeira ocorrência do X em cada linha será trocada por Y. Caso queira que todos os X da linha sejam substituídos por Y deve-se usar a opção "g" no final: 's/X/Y/g'



9. Re: Identificar diferenças entre linhas [RESOLVIDO]

Ede
ede_linux

(usa Ubuntu)

Enviado em 30/08/2017 - 12:12h

Beleza, adorei a explicação!
Tenho mesmo que dedicar tempo ao shell script! é poderoso!

Que métodos aconselha para estudar shell script? é que acabo sempre me perdendo :(

Muito Obrigado


10. Re: Identificar diferenças entre linhas [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 30/08/2017 - 16:39h

ede_linux escreveu:

Beleza, adorei a explicação!
Tenho mesmo que dedicar tempo ao shell script! é poderoso!

Que métodos aconselha para estudar shell script? é que acabo sempre me perdendo :(

Muito Obrigado


Boa tarde Ede, qto ao seu comando:
sed -r 's/^.{32}//' file1.txt | sed -r 's/^.{64}//' file2.txt |sort|uniq -u
Vejo que deve separar em trez partes....
sed -r 's/^.{32}//' file1.txt >> file3.txt
sed -r 's/^.{64}//' file2.txt >> file3.txt
sort file3.txt | uniq -u


Recomendações:
Site do Aurelio, muito bom.
Tbem recomendo:
https://jneves.wordpress.com/

Abç.:
Marcelo Oliver






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts