[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Comparar dois arquivos
From: |
Enio Onodera |
Subject: |
Re: [shell-script] Comparar dois arquivos |
Date: |
Fri, 19 Jul 2013 08:19:15 -0700 (PDT) |
Verifica se não tem mac repetido na mesma tabela.
Tá subtraindo 340 de a.csv (que é a quantidade correta de macs repetidos entre
as tabelas) e 396 de b.csv (onde talvez existam mac repetidos na mesma tabela,
aumentando o número de linhas subtraidas).
Talvez filtrar as tabelas com sort e uniq te ajude a visualizar isso.
Atte,
Enio Onodera
________________________________
De: Alfredo Casanova <address@hidden>
Para: address@hidden
Enviadas: Sexta-feira, 19 de Julho de 2013 11:42
Assunto: [shell-script] Comparar dois arquivos
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]