Localizar e Substituir (em massa) [RESOLVIDO]

Iniciado por Lestat, 20 de Junho de 2011, 01:36

tópico anterior - próximo tópico

Lestat

Boa noite amigos,
to quebrando a cabeça aqui e acho que alguém de vocês pode me dar uma luz!
Tenho uma planilha em TXT separada por ponto e e virgula e preciso localizar todos os campos que tem entrada igual. Por exemplo:

Citartrue    try    type    u    ur
sure    take    true    try    think

o "True" e o "Try" apareceram duas vezes... pra uma tabelinha pequena que nem essa da pra usar o localizar e substituir do BR office, o problema é quando a tabela tem 1000 entradas. fazer uma por 1 dá 1 trabalho do cão.
Alguém saberia como agilizar isso em bash ou de qualquer outra forma mais fácil (e principalmente rápida)?

Obrigado,
abraços ;)
"O Primeiro Dever da Inteligência é Duvidar de Si Mesma" Albert Einstein

irtigor

O texto diz uma coisa, mas no exemplo tem outra... vou só sugerir: use o sed.

Lestat

Certo, mas como fica a sintaxe do sed? lembrando que eu NÃO SEI as palavras que to procurando. só quero substituir entradas iguais por "espaço"

Abraço
"O Primeiro Dever da Inteligência é Duvidar de Si Mesma" Albert Einstein

irtigor

Como é que eu posso fornecer um exemplo se você não explica o que realmente quer?

#!/usr/bin/env python

import sys

seen  = []
seen2 = []
for arg in sys.argv[1:]:
   try:
       f = open(arg, 'r')
   except IOError:
       print 'cannot open', arg
   else:
       for line in f:
           words = line.rstrip('\n').split()

           for word in words:
               if not word in seen:
                   seen.append(word)
               else:
                   seen2.append(word)
           seen.append("\n")
       f.close()
       for word in seen:
           if not word in seen2:
               print word,




É só fornecer o nome do arquivo. Ex:
Citar➜  ~  cat temp.txt
true    try    type    u    ur
sure    take    true    try    think
➜  ~  ./teste.py temp.txt
type u ur
sure take think
➜  ~  

Lestat

#4
Achei que tinha sido claro, devo ter me expressado mal, desculpe.
O que eu quero fazer é o seguinte tenho uma tabela com "n-entradas" e quero localizar e substituir (por vazio) todas as entradas duplicadas.
O exemplo que tinha dado anteriormente de uma tabela "imaginária" com as entradas

Citartrue    try    type    u    ur
sure    take    true    try    think

era só pra ilustrar que o "true" e o "try" se repetiam e quero que eles sejam substituídos por "branco" (pode ser por vazio mesmo, ou por 1 palavra genérica, tipo "Repetido"). A diferença é que estou "mostrando" a tabela, para saber que tem essas entradas, quero fazer isso de forma automática. simplesmente rodando o script, ou comando, em cima do meu arquivo e ele limpando as entradas iguais.

Valeu ;)

...a ia quase esquecendo o script que tu passou me retorna o seguinte resultado:
Citar./teste.py: 5: seen: not found
./teste.py: 6: seen2: not found
./teste.py: 8: Syntax error: word unexpected (expecting "do")
"O Primeiro Dever da Inteligência é Duvidar de Si Mesma" Albert Einstein

fpissarra

#5
Citação de: Lestat online 20 de Junho de 2011, 15:58
Achei que tinha sido claro, devo ter me expressado mal, desculpe.
O que eu quero fazer é o seguinte tenho uma tabela com "n-entradas" e quero localizar e substituir (por vazio) todas as entradas duplicadas.
O exemplo que tinha dado anteriormente de uma tabela "imaginária" com as entradas

Citartrue    try    type    u    ur
sure    take    true    try    think

era só pra ilustrar que o "true" e o "try" se repetiam e quero que eles sejam substituídos por "branco" (pode ser por vazio mesmo, ou por 1 palavra genérica, tipo "Repetido"). A diferença é que estou "mostrando" a tabela, para saber que tem essas entradas, quero fazer isso de forma automática. simplesmente rodando o script, ou comando, em cima do meu arquivo e ele limpando as entradas iguais.

Valeu ;)

...a ia quase esquecendo o script que tu passou me retorna o seguinte resultado:
Citar./teste.py: 5: seen: not found
./teste.py: 6: seen2: not found
./teste.py: 8: Syntax error: word unexpected (expecting "do")

Veja: Seu exemplo mostra DUAS linhas diferentes que contém DUAS palavras iguais.
Isso não é, necessariamente, "entradas duplicadas".

O que você quer, acredito, mas não tenho certeza, e percorrer a tabela inteira e substituir "palavras" duplicadas?

Ahhh... e aqui o script em python feito por irtigor funcionou perfeitamente com o temp.txt fornecido.

[]s
Fred

irtigor


#!/usr/bin/env python

import sys

seen  = []
seen2 = []
for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        for line in f:
            words = line.rstrip('\n').split()

            for word in words:
                if not word in seen:
                    seen.append(word)
                else:
                    seen2.append(word)
            seen.append("\n")
        f.close()
        f = open(arg, 'r')
        for line in f:
            words = line.rstrip('\n').split()
            for word in words:
                if not word in seen2:
                    print word,
                else:
                    print "--espaco--",
            print
        f.close()



Citar
➜  ~  cat temp.txt       
true    try    type    u    ur
sure    take    true    try    think
➜  ~  ./teste2.py temp.txt
--espaco-- --espaco-- type u ur
sure take --espaco-- --espaco-- think

Lestat

...exatamente isso fpissarra, eu tenho uma tabela com 9 linhas por 100 colunas, sendo que cada espaço da tabela tem UMA palavra, logo, terei 900 palavras... quero, pegar a primeira palavra, comparar com toda a tabela, caso exista outra entrada igual as duas (ou quantas existirem) passam a ser uma célula vazia da tabela... no exemplo anterior que tinha dado:
Citartrue    try    type     u       ur
sure    take    true    try    think


CitarXXX    XXX    type    u        ur
sure    take    XXX    XXX    think

SENDO QUE: XXX equivale a (nada = célula vazia)

Valeu ;)
"O Primeiro Dever da Inteligência é Duvidar de Si Mesma" Albert Einstein

Lestat

irtigor acho que funcionou, só substitui o "--espaco--" por "espaco;" (para ele entender como célula da planilha) vou fazer mais alguns testes e já posto o resultado! valeu!
"O Primeiro Dever da Inteligência é Duvidar de Si Mesma" Albert Einstein

Lestat

Tchê!!!! Funcionou! a única coisa que precisei modificar foi substituir o "--espaco--" por ";espaco" e não "espaco;" como tinha dito antes. sem palavras para agradecer =D
uma ótima semana
"O Primeiro Dever da Inteligência é Duvidar de Si Mesma" Albert Einstein