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: Leslie Watter
Subject: Re: [shell-script] Comparar dois arquivos
Date: Fri, 19 Jul 2013 17:50:49 -0300

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]



reply via email to

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