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

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

Re: [shell-script] Como usar o UNIQ em CSV


From: Julio C. Neves
Subject: Re: [shell-script] Como usar o UNIQ em CSV
Date: Wed, 23 Jan 2008 13:45:49 -0200

Fala César,
O problema é que o uniq tem opção para saltar os n primeiros campos mas não
tem como saltr os m últimos. Desta forma vc pode saltar o código e o nome,
mas o uniq irá atuar no CPF e endereço e aí a vaca vai pro brejo.

O que vou portar não deve ser veloz, mas pelo menos é um one-liner com uma
abordagem bastante curiosa. Veja:

$ cut -f3 -d; lixo | cat -n | sort -k 2,3 | uniq -f 1 | cut -c-6 | xargs -i
bash -c "head -{} lixo | tail -1"

Explico:
cortei somente o CPF e o cat -n numerou as linhas. Veja:

$ cut -f3 -d';' lixo1 | cat -n
     1  CPF
     2  12345678900
     3  12345678900
     4  98765432100

O sort -k 2,3 classificou pelo 2o. campo (CPF) e o -f 1 do uniq foi para
saltar o 1o. campo (seqüencial) e atuando tb sobre o CPF. Veja:

$ cut -f3 -d';' lixo1 | cat -n | sort -k 2,3 | uniq -f 1
     2  12345678900
     4  98765432100
     1  CPF

Pronto, as duplicidades já morreram. Vamos então reconstruir esses
registros. O cut -c-6 pega os 6 primeiros dígitos (seqüencial) e manda-os
para o xargs que se responsabilizará por chamar o bash afim de interpretar o
par head e tail para listar os registros desejados. Veja
aqui<https://twiki.softwarelivre.org/bin/view/TWikiBar/TWikiBarBirinaite>detalhes
sobre o xargs com a opção -i.

$ cut -f3 -d';' lixo1 | cat -n | sort -k 2,3 | uniq -f 1 | cut -c-6 | xargs
-i bash -c "head -{} lixo1 | tail -1"
001;João Silva;12345678900;Rua x
003;José;98765432100;Rua y
Código;Nome;CPF;Endereço

O único problema é que ele tira da ordenação inicial.

Abraço,
Julio
:wq



Em 23/01/08, César Vianna <address@hidden> escreveu:
>
>   O arquivo é da seguinte forma
>
> Código;Nome;CPF;Endereço
> 001;João Silva;12345678900;Rua x
> 002;João Francisco Silva;12345678900;Rua x
> 003;José;98765432100;Rua y
>
> O resultado esperado é separar
>
> #CPF único
> 003;José;98765432100;Rua
>
> e
>
> #CPF duplicado
> 001;João Silva;12345678900;Rua x
> 002;João Francisco Silva;12345678900;Rua x
>
> Acabei fazendo em duas etapas. Separei duas listas de CPFs com "uniq -u" e
> "uniq -d" e depois fiz o seguinte script
>
> #!/bin/bash
> cat cpfs-duplicados.txt|
> while read i
> do
> grep $i retirar-cpfs-duplicados.csv >> duplicados.csv
> done
> cat cpfs-unicos.txt|
> while read i
> do
> grep $i retirar-cpfs-duplicados.csv >> unicos.csv
> done
>
> Ok,. Funcionou. Mas muito lento...
>
> 2008/1/23 Flavio Junior <address@hidden <billpp%40gmail.com>>:
>
> > Não entendi bem..
> >
> > mas veja as opções do sort e do uniq...
> >
> > Exemplo:
> >
> > sort
> > -k, --key=POS1[,POS2] start a key at POS1, end it at POS2 (origin 1)
> > -t, --field-separator=SEP use SEP instead of non-blank to blank
> transition
> >
> > uniq
> > -f, --skip-fields=N avoid comparing the first N fields
> >
> > Sem um padrão do arquivo fica dificil..
> > Vc passar dados dos outros impossivel...
> >
> > Então fica mais dificil ajudar, mas se puder montar algo com umas 4 ou
> > 5 linhas no padrão e dados inuteis, eu tentaria ajudar mais..
> >
> > --
> >
> > Flávio do Carmo Júnior
> >
> > 2008/1/23 César Vianna <address@hidden<cesar.vianna%40gmail.com><
> cesar.vianna%40gmail.com>
> > >:
> >
> > >
> > >
> > >
> > >
> > >
> > >
> > > Buenas !!
> > >
> > > Tenho um csv com 5 campos. O terceiro são CPFs. Tenho que separar em
> > dois
> > > arquivos: um com os CPFs duplicados e outro com os CPFs únicos.
> > >
> > > Fiz assim:
> > >
> > > cut -d";" -f3 arquivo.csv | uniq -d
> > >
> > > e
> > >
> > > cut -d";" -f3 arquivo.csv | uniq
> > >
> > > Ok. O problema é que eu perco o resto da linha. Tem alguma opção do
> uniq
> > ou
> > > outro comando para recuperar o conteúdo da linha? Como os grupos ( \1
> > ... )
> > > em expressões regulares.
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> >
> >
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Abraços,
Julio


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



reply via email to

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