+ Responder ao Tópico



  1. #1

    Padrão Filtro de dados

    fala galera, bl'z??

    galera, seguinte:

    tenhamos a seguinte situação hipotética:

    tenho um arquivo com os seguintes dados:

    123
    123
    123
    1234
    1234
    1234
    12345
    12345
    12345

    e preciso filtrar este arquivo para retirar as linhas repetidas.

    o problema é q eu não lembro qual comando faz isso.
    :toim: :toim: :toim: :toim: :toim: :toim: :toim:

    se alguém puder refrescar minha memória agradeço :good:

    valew

  2. #2

    Padrão Filtro de dados

    caramba galera...

    ninguém lembra como faz isso???


  3. #3
    Avenger
    Visitante

    Padrão Filtro de dados

    depende da onde vc ker fazer isso? é em bash? perl? python?

    se for em bash e os dados repetidos forem sempre seguidos mesmo, você pode fazer algo assim:
    Código :
    #!/bin/bash
    arquivo="$(cat arquivo)"
    lines=$(echo "${arquivo}" | wc -l)
    currline=;oldline=;
    for ((counter=1; ${counter} -le $lines; counter=$((${counter} + 1)))); do
     currline="$(echo "${arquivo}" | head -n ${counter} | tail -n 1)"
     if [ "${currline}" != "${oldline}" ]; then
      oldline="${currline}"
      echo "${currline}"
      # ou: echo "${currline}" >> arquivo_filtrado
     fi
    done

    Depurando esse código, a idéia dele é a mesma. Acho que se vc souber qquer lingua de programação é fácil portar isso prá c, perl, php, etc.

    Espero que ajude.

  4. #4

    Padrão Filtro de dados

    oo cara...

    valew pela ajuda...

    o script seria em bash mesmo

    ainda estou me aperfeiçoando em bash script, e muitas vezes preciso de ajuda...

    entendi o q o script fará, mas ele está dando erro na linha 5, erro de sintaxe...

    verei se consigo corrigir o erro, mas qualquer coisa eu pedirei ajuda novamente..

    valew

  5. #5
    Avenger
    Visitante

    Padrão Filtro de dados

    debuguei:

    Código :
    #!/bin/bash 
    arquivo="$(cat arquivo)" 
    lines=$(echo "${arquivo}" | wc -l) 
    currline=;oldline=; 
    for ((counter=1; counter <= $lines; counter=$((${counter} + 1)))); do 
     currline="$(echo "${arquivo}" | head -n ${counter} | tail -n 1)" 
     if [ "${currline}" != "${oldline}" ]; then 
      oldline="${currline}" 
      echo "${currline}" 
      # ou: echo "${currline}" >> arquivo_filtrado 
     fi 
    done

    (plo menos aki funfow agora)

  6. #6

    Padrão Filtro de dados

    oo cara...

    agora sim... era exatamente isso q eu queria...

    não me lembro direito, mas acredito q a uns dias atrás eu vi em um lugar um comando faz isso, não precisava de script nenhum...

    mas este aqui resolve o problema...

    valew :good:

  7. #7
    Avenger
    Visitante

    Padrão Filtro de dados

    Tá bom, só fica ligado que do jeito que eu coloquei, se tiver
    1111
    1112
    1111
    ele vai mostrar os tres
    ele só compara se o -ANTERIOR- é igual atual. Se for, ele ignora. Eh o caso mais simples mesmo que eu abordei.
    Talvez o comando que você viu foi o 'grep'... Mas se ajeitou, beleza :P

  8. #8

    Padrão Filtro de dados

    Citação Postado originalmente por Avenger
    Tá bom, só fica ligado que do jeito que eu coloquei, se tiver
    1111
    1112
    1111
    ele vai mostrar os tres
    ele só compara se o -ANTERIOR- é igual atual. Se for, ele ignora. Eh o caso mais simples mesmo que eu abordei.
    Talvez o comando que você viu foi o 'grep'... Mas se ajeitou, beleza :P
    opa... esquenta não..

    eu vi como funciona o script... e o arquivo gerado fica em ordem, qualquer coisa o sort resolveria o problema...

    e o comando q disse não é o grep nem o egrep...

    mas desde q precisei disso não me lembro onde vi o comando e muito menos qual comando era... talvez o mesmo nem exista.. heheheh

    ahh.. e soh pra vc saber o pq eu precisei deste script, é para liberar o nfs no firewall, com isso eu pego as portas e para as regras de iptables..

    valew

  9. #9
    belvio
    Visitante

    Padrão Filtro de dados

    cat [arquivo] | sort -u

  10. #10

    Padrão Filtro de dados

    Citação Postado originalmente por lucianogf
    e o comando q disse não é o grep nem o egrep...
    Olá!

    Esse comando não seria o uniq?

    :good:

    []'s
    Cléoson.

  11. #11
    Avenger
    Visitante

    Padrão Filtro de dados

    o [b]uniq[/u] faz exatamente o mesmo que meu scriptzinho fez (legau!) o sort, por sua vez, tirou repetecos 'à frente', deixando então só uma versão de cada amostra.

    Porém o 'sort -u' 'ordenou' antes de limpar o pessoal, ao invés de apenas tirar repetecos. (ex.: se tem 111 depois de 222, e mais uns 15 111's à frente, ele só vai exibir um exemplar de '111', porém esta irá aparecer antes do '222', tirando a ordenação natural da amostra.)

  12. #12

    Padrão Filtro de dados

    Citação Postado originalmente por cleoson
    Citação Postado originalmente por lucianogf
    e o comando q disse não é o grep nem o egrep...
    Olá!

    Esse comando não seria o uniq?

    :good:

    []'s
    Cléoson.
    oooo camarada...

    não lembro se era este comando "uniq" q eu tinha visto, mas este faz exatamente o q eu queria...

    mas mesmo com este comando o arquivo precisa estar em ordem, pois ele compara a linha seguinte com a anterior...

    neste caso existe a necessidade de utilizar o sort antes do uniq nada q eu pipe não resolva.. hehehe

    valew

  13. #13

    Padrão Filtro de dados

    Citação Postado originalmente por Avenger
    o [b]uniq[/u] faz exatamente o mesmo que meu scriptzinho fez (legau!) o sort, por sua vez, tirou repetecos 'à frente', deixando então só uma versão de cada amostra.

    Porém o 'sort -u' 'ordenou' antes de limpar o pessoal, ao invés de apenas tirar repetecos. (ex.: se tem 111 depois de 222, e mais uns 15 111's à frente, ele só vai exibir um exemplar de '111', porém esta irá aparecer antes do '222', tirando a ordenação natural da amostra.)
    cara....

    agora lembrei....

    soh q fui testar aqui a opção "sort -u" soh depois q respondi anteriormente...

    acredito q o comando q eu vi certa vez era o sort mesmo, mas não lembrava do parametro -u....

    e como meu inglês não é aquelas coisa, não adiantou eu per a manpage do sort...

    e eu testei o comando aqui com o parametro -u pq não lembrava o q o mesmo fazia, ae vi o resultado... e era exatamente este q eu esperava...

    acredito q agora não vou mais esquecer deste comando.. hehehehe

    valew