shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Comparar dois arquivos


From: Saulo Alves Martins
Subject: Re: [shell-script] Comparar dois arquivos
Date: Fri, 19 Jul 2013 14:09:20 -0700 (PDT)

Leslie,

# Apenas fazendo pequenas correções:


1)  MAC adresses que existam apenas no primeiro arquivo (imprimindo a linha 
completa)?

$ comm -2 -3 <(sort ARQ1) <(sort ARQ2)


2)  MAC adresses que existam apenas no segundo arquivo (idem)?

$  comm -1 -3 <(sort ARQ1) <(sort ARQ2)



3) Macs que ocorram nos dois arquivos?

 $ comm -1 -2 <(sort ARQ1) <(sort ARQ2)





# sortVeja alguns resultados:

$ paste arq1.txt arq2.txt 
teste1testeA
teste2testeB
teste3teste3
teste4teste4
teste5teste5
teste6teste6
teste7teste7
teste8teste8
teste9teste9


$ comm -2 -3 <(sort arq1.txt) <(sort arq2.txt)
teste1
teste2

$ comm -1 -3 <(sort arq1.txt) <(sort arq2.txt)
testeA
testeB

$ comm -1 -2 <(sort arq1.txt) <(sort arq2.txt)
teste3
teste4
teste5
teste6
teste7
teste8
teste9

# Sem usar o "sort" os resultados são "bizarros":

$ comm -2 -3 arq1.txt arq2.txt
teste1
teste2
teste3
teste4
teste5
teste6
teste7
teste8
teste9
comm: arquivo 2 não está classificado em ordem


$ comm -1 -3 arq1.txt arq2.txt
testeA
testeB
comm: arquivo 2 não está classificado em ordem
teste3
teste4
teste5
teste6
teste7
teste8
teste9

$ comm -1 -2 arq1.txt arq2.txt
comm: arquivo 2 não está classificado em ordem


$ comm -2 -3 --nocheck-order arq1.txt arq2.txt
teste1
teste2
teste3
teste4
teste5
teste6
teste7
teste8
teste9

$ comm -1 -3 --nocheck-order arq1.txt arq2.txt
testeA
testeB
teste3
teste4
teste5
teste6
teste7
teste8
teste9


$ comm -1 -2 --nocheck-order arq1.txt arq2.txt










________________________________
 De: Leslie Watter <address@hidden>
Para: address@hidden 
Enviadas: Sexta-feira, 19 de Julho de 2013 17:50
Assunto: Re: [shell-script] Comparar dois arquivos
 


  
Ae Julio, Lista,

Dá pra fazer com o comm. Por exemplo

comm -3 <(sort ARQ1) <(sort ARQ2)

e vc terá as linhas que aparecem nos 2 arquivos.

Agora colando as perguntas / respostas:

1) MAC adresses que existam apenas no primeiro arquivo (imprimindo a linha
completa)

*comm -1 <(sort ARQ1) <(sort ARQ2)*

2) MAC adresses que existam apenas no segundo arquivo (idem)

*comm -2 <(sort ARQ1) <(sort ARQ2)*

3) Macs que ocorram nos dois arquivos.

*comm -3 <(sort ARQ1) <(sort ARQ2)*

Chegou até a combinar a pergunta com a opção do comm :D

é uma mão na roda. O único detalhe é que ele precisa dos arquivos ordenados
;-)

Da man page do comm:
-----------

NAME
comm - compare two sorted files line by line

SYNOPSIS
comm [OPTION]... FILE1 FILE2

DESCRIPTION
Compare sorted files FILE1 and FILE2 line by line.

With  no  options,  produce  three-column  output.  Column one
contains lines unique to FILE1, column two contains lines unique to FILE2,
and column three contains
lines common to both files.

-1     suppress column 1 (lines unique to FILE1)

-2     suppress column 2 (lines unique to FILE2)

-3     suppress column 3 (lines that appear in both files)
---------------------------------

[]s

LEslie

2013/7/19 Julio C. Neves <address@hidden>

> De antemão já vou falando: o cmd comm resolve esse problema, o problema é
> que não lembro da sua sintaxe e seu man é incompleto. Peço a quem tiver
> tempo de bisbilhotar na internet e achar um site que aborde legal este cmd
> que o poste na lista. Por falar em lista, há muito tempo publicaram nela
> algo muito parecido usando o comm.
>
> Vou da uma dica, usando o grep -f ARQ_DE_REGEXP ARQ_DE_DADOS Para isso
> vamos dizer que seus arquivos são arq1 e arq2.
>
> #  Criando 1 arquivo com as regexps dos mac de arq1
> grep -Eo ^.{17} arq1 | sed 's/^/^/;s/$/$/' > arqer1
> #  Os registros de arqer1 estão da forma:
> #+ ^hh:hh:hh:hh:hh:hh$, onde h é um hexadecimal
> #+ Vamos fazer o mesmo para arq2
> grep -Eo ^.{17} arq2 | sed 's/^/^/;s/$/$/' > arqer2
> #  Agora é só correr para o abraço
> #  MAC adresses que existam apenas no primeiro arquivo
> grep -vf arqer2 arq1
>
> #  MAC adresses que existam apenas no segundo arquivo
> grep -vf arqer1 arq2
>
> #  Macs que ocorram nos dois arquivos.
> grep -f arqer1 arq2
>
> rm -i arqer1 arqer2
>
>
> Abcs,
> Julio
> *@juliobash
> *
>
>
>
> Em 19 de julho de 2013 11:42, Alfredo Casanova <address@hidden
> >escreveu:
>
> > **
> >
> >
> > Galera, tenho 2 arquivos CSV separados por tabulação, que seguem regras
> de
> > formação distintas. A única semelhança é que ambos tem como primeiro
> campo
> > o MAC ADDRESS de várias máquinas.
> >
> > Preciso comparar esses dois arquivos e gerar 3 listas:
> >
> > 1) MAC adresses que existam apenas no primeiro arquivo (imprimindo a
> linha
> > completa)
> >
> > 2) MAC adresses que existam apenas no segundo arquivo (idem)
> >
> > 3) Macs que ocorram nos dois arquivos.
> >
> > fiz o seguinte:
> >
> > (disponíve em: http://pastie.org/8155816)
> >
> > #!/bin/bash
> > # organizar argumentos em um array
> > args=( $* )
> >
> > # retirar os CRLF
> > dos2unix ${args[@]}
> >
> > #excluir a primeira linha dos dois arquivos
> > sed -i '1d' ${args[0]}
> > sed -i '1d' ${args[1]}
> >
> > # isolar apenas as linhas que comecem com um mac address, afim de evitar
> > erros
> > grep -Ei '^([0-9a-f]{2}-){5}[0-9a-f]{2}' ${args[0]} > .tmp; mv .tmp
> > ${args[0]}
> > grep -Ei '^([0-9a-f]{2}-){5}[0-9a-f]{2}' ${args[1]} > .tmp; mv .tmp
> > ${args[1]}
> >
> > for i in 0 1
> > do
> > # pegar todos os MACS do arquivo e organiza-los em uma só linha,
> separando
> > por um OU
> > # para posterior utilizacao em um grep -E
> > var=$(grep -Eio '([0-9a-f]{2}-){5}[0-9a-f]{2}' ${args[$i]} | sed
> > ':a;$!N;s/\n/\|/;ta;')
> >
> > [ $i -eq 0 ] && { grep -E "$var" ${args[1]} >>
> > PresentesEm${args[0]}E${args[1]};
> > grep -Ev "$var" ${args[1]} > Apenasem${args[1]}; } || grep -Ev "$var"
> > ${args[0]} > Apenasem${args[0]};
> > done
> >
> > mas no final a contagem de linhas nao bate:
> >
> > $ wc -l a.csv b.csv
> > 2395 a.csv
> > 3019 b.csv
> > 5414 total
> >
> > $ wc -l Apenasema.csv Apenasemb.csv PresentesEma.csvEb.csv
> > 2055 Apenasema.csv
> > 2623 Apenasemb.csv
> > 396 PresentesEma.csvEb.csv
> > 5074 total
> >
> > Não sei se estou com algum furo na lógica que não consegui ver... alguma
> > luz?
> >
> > --
> > []'s
> > Alfredo Casanova
> > Linux User #228230
> > msn: address@hidden
> > tel: +55 61 9655 9619
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> ----------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> prévio aviso.
> ----------------------------------------------------------
> Sair da lista: address@hidden
> ----------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em
> http://www.listas-discussao.cjb.net
> ----------------------------------------------------------
> Servidor Newsgroup da lista: news.gmane.org
> Grupo: gmane.org.user-groups.programming.shell.brazil
>
> Links do Yahoo! Grupos
>
>
>

-- 
Leslie H. Watter

[As partes desta mensagem que não continham texto foram removidas]


 

[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]