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: Julio C. Neves
Subject: Re: [shell-script] Comparar dois arquivos
Date: Fri, 19 Jul 2013 16:30:01 -0300

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]



reply via email to

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