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

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

Re: Filtrar e comparar campos de arquivos distintos


From: nerobarrabas
Subject: Re: Filtrar e comparar campos de arquivos distintos
Date: Tue, 28 May 2013 13:10:12 -0000
User-agent: eGroups-EW/0.82

Mestre Julio,

Desculpe.
É que sou bem "chucro" em shell.
Estou tentando aprender.
Com sinceridade, tenha certeza absoluta que tô ralando aqui SIM!
E enquanto o Mestre puxava minha orelha, eu tentava aqui achar uma solução.
Usando sua última dica, fiz um teste inicial prá ver se o retorno era vazio ou 
não. Caso sim, entra no laço while. Caso não, sai do script com a msg de OK.
Poderiam dizer se existe furo de lógica nisso? Faltou alguma coisa?
Pois meu cadastro.txt real tem dezenas de milhares de linhas e dezenas de 
colunas.

Grato e desculpem mais uma vez. Vou tentar perturbar menos (vou tentar! rsrsrs).

Ficou assim:
#!/bin/bash
RETCMD=$(grep -v ';;' cadastro.txt  | sed -e '1d' | grep -vf <(sed 
's/^/\;/;s/$/$/' cidade.txt))
if [ -n "$RETCMD" ] ; then
NrColNome=`cat cadastro.txt | head -1 | sed 's/\;/\n/g' | nl | grep -w nome | 
awk '{print $1}'`
NrColCidade=`cat cadastro.txt | head -1 | sed 's/\;/\n/g' | nl | grep -w cidade 
| awk '{print $1}'`
cat cadastro.txt | sed -e '1d' |
while read linha_cadastro ; do
        linha_cidade=$(echo $linha_cadastro | cut -d \; -f $NrColCidade );
        RETCMD=$(grep -c "$linha_cidade" cidade.txt);
        if [ "$RETCMD" == "0" ]; then
        echo [ERRO] $linha_cadastro | awk 'BEGIN { FS = ";" } ; {print 
$'$NrColNome' ": cidade "$'$NrColCidade' " NAO está em \"cidade.txt\""}';
        fi ;
done
else
echo "[OK] Todas as cidades estão em \"cidade.txt\""
fi



--- Em address@hidden, "Julio C. Neves" <julio.neves@...> escreveu
>
> Tô fora, vc não está fazendo absolutamente nada! Vc está explorando a lista
> para irmos devagarzinho resolvendo o teu problema.
> 
> Cadê a tua contribuição no código? Ajudar é uma coisa, fazer para vc é
> outra bem diferente...
> 
> Abcs,
> Julio
> *@juliobash
> *
> 
> 
> 
> Em 27 de maio de 2013 22:53, nerobarrabas <diramos@...> escreveu:
> 
> > **
> >
> >
> > PessoALL,
> > Através das dicas aqui recebidas cheguei aqui:
> >
> > Meu "cadastro.txt":
> >
> > nome;sobrenome;cidade
> > joao;silva;brasilia
> > carlos;souza;salvador
> > chico;pereira;sao paulo
> > marcos;nogueira;belo horizonte
> > paulo;nogueira;campo grande
> >
> > Meu "cidade.txt":
> >
> > brasilia
> > salvador
> > sao Paulo
> >
> > Meu script:
> >
> > #!/bin/bash
> > NrColNome=`cat cadastro.txt | head -1 | sed 's/\;/\n/g' | nl | grep -w
> > nome | awk '{print $1}'`
> > NrColCidade=`cat cadastro.txt | head -1 | sed 's/\;/\n/g' | nl | grep -w
> > cidade | awk '{print $1}'`
> > cat cadastro.txt | sed -e '1d' |
> > while read linha_cadastro ; do
> > linha_cidade=$(echo $linha_cadastro | cut -d \; -f $NrColCidade );
> > RETCMD=$(grep -c "$linha_cidade" cidade.txt);
> > if [ "$RETCMD" == "0" ]; then
> > echo [ERRO] $linha_cadastro | awk 'BEGIN { FS = ";" } ; {print
> > $'$NrColNome' ": cidade "$'$NrColCidade' " NAO está em \"cidade.txt\""}';
> > else
> > echo [OK] $linha_cadastro | awk 'BEGIN { FS = ";" } ; {print $'$NrColNome'
> > ": cidade " $'$NrColCidade' " está em \"cidade.txt\""}';
> > fi ;
> > done
> >
> > Meu retorno:
> >
> > [OK] joao: cidade brasilia está em "cidade.txt"
> > [OK] carlos: cidade salvador está em "cidade.txt"
> > [OK] chico: cidade sao paulo está em "cidade.txt"
> > [ERRO] marcos: cidade belo horizonte NAO está em "cidade.txt"
> > [ERRO] paulo: cidade campo grande NAO está em "cidade.txt"
> >
> > Preciso agora sair do laço "while" de modo que o retorno fique assim:
> >
> > - Se houver erro, mostrar as linhas de erros:
> >
> > [ERRO] marcos: cidade belo horizonte NAO está em "cidade.txt"
> > [ERRO] paulo: cidade campo grande NAO está em "cidade.txt"
> >
> > - Se não houver erro nenhum, retornar com a mensagem:
> >
> > [OK] - Sem erros
> >
> > Como eu saio do "While"?!?!?
> >
> > Grato
> >
> > Diramos
> >
> > --- Em address@hidden, "Julio C. Neves" <julio.neves@>
> > escreveu
> > >
> > > Sem dúvida alguma. Escrevi a linha sem testá-la :( A pressa é a minha
> > > principal inimiga. Por isso uso Shell e resolvo tudo com one-liner... ;).
> > >
> > > Retificando:
> > >
> > > $ grep -v ';;' cadastro.txt | grep -vf <(sed 's/^/\;/;s/$/$/'
> > cidades.txt)
> > >
> > > Abcs,
> > > Julio
> > > *@juliobash
> > > *
> > >
> > >
> > >
> > > Em 27 de maio de 2013 18:45, Alfredo Casanova <atcasanova@>escreveu:
> > >
> > > > **
> > > >
> > > >
> > > > não teria faltado o nome do arquivo no SED?
> > > >
> > > > 2013/5/27 Julio C. Neves <julio.neves@>
> > > >
> > > > > grep -v ';;' cadastro.txt | grep -vf <(sed 's/^/\;/;s/$/$/')
> > > > >
> > > > > Abcs,
> > > > > Julio
> > > > > *@juliobash
> > > > > *
> > > > >
> > > > >
> > > > >
> > > > > Em 27 de maio de 2013 15:00, nerobarrabas <diramos@> escreveu:
> > > > >
> > > > > > **
> > > > > >
> > > > > >
> > > > > > Pessoal,
> > > > > >
> > > > > > Continuando com meu problema:
> > > > > > Tenho 02 arquivos, com campos separados por ";", com o seguinte
> > > > conteúdo:
> > > > > >
> > > > > > cadastro.txt
> > > > > >
> > > > > > nome;sobrenome;cidade
> > > > > > joao;silva;brasilia
> > > > > > carlos;souza;salvador
> > > > > > chico;pereira;sao paulo
> > > > > > marcos;nogueira;belo horizonte
> > > > > > paulo;nogueira;campo grande
> > > > > >
> > > > > > cidade.txt
> > > > > >
> > > > > > brasilia
> > > > > > salvador
> > > > > > sao paulo
> > > > > >
> > > > > > Estou tentando fazer um script que funcione assim:
> > > > > >
> > > > > > Leia cada linha do arquivo cadastro.txt (a partir da segunda
> > linha) e a
> > > > > > compare com o
> > > > > > arquivo "cidade.txt", retornando todas as linhas (completas) do
> > > > > > "cadastro.txt"
> > > > > > cuja 3ª coluna não conste do arquivo cidade.txt.
> > > > > > Então, o meu retorno, para o caso acima, teria que ser o seguinte:
> > > > > >
> > > > > > marcos;nogueira;belo horizonte
> > > > > > paulo;nogueira;campo grande
> > > > > >
> > > > > > Tentei grep -Fxv -f cidade.txt cadastro.txt mas o retorno não foi o
> > > > > > esperado.
> > > > > >
> > > > > > Poderiam ajudar?
> > > > > >
> > > > > > Grato.
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > > [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
> > > > >
> > > > >
> > > > >
> > > >
> > > > --
> > > > []'s
> > > > Alfredo Casanova
> > > > Linux User #228230
> > > > msn: atcasanova@
> > > > 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]
> > >
> >
> >  
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>




reply via email to

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